sql >> Base de Datos >  >> RDS >> Sqlserver

Usar el LAG de SQL Server 2012

De acuerdo, antes que nada, agregué una fila para mostrarte dónde no funciona la respuesta de otra persona, pero ahora la eliminaron.

Ahora para la lógica en mi consulta. Dijiste que quieres cada fila que esté dentro de los dos minutos de otra fila. Eso significa que debe mirar no solo hacia atrás, sino también hacia adelante con LEAD(). En su consulta, regresó cuando la hora anterior era NULL, por lo que simplemente devolvió el primer valor de cada número de pedido, independientemente de si era correcto o incorrecto. Por casualidad, los primeros valores de cada uno de sus Números de pedido debían devolverse hasta llegar al último Número de pedido donde se rompió. Mi consulta corrige eso y debería funcionar para todos sus datos.

CREATE TABLE [Order]  
    (
            OrderNumber    VARCHAR(20) NOT NULL
        ,   OrderDateTime   DATETIME NOT NULL
    );

    INSERT [Order] (OrderNumber, OrderDateTime) 
    VALUES
        ('1234', '2012-04-28 09:00:00'),
        ('1234', '2012-04-28 09:01:00'),
        ('1234', '2012-04-28 09:03:00'),
        ('5678', '2012-04-28 09:40:00'),
        ('5678', '2012-04-28 09:42:00'),
        ('5678', '2012-04-28 09:44:00'),
        ('91011', '2012-04-28 10:00:00'),
        ('91011', '2012-04-28 10:25:00'),
        ('91011', '2012-04-28 10:27:00');

with Ordered as (
  select
    OrderNumber,
    OrderDateTime,
    LAG(OrderDateTime,1) over (
      partition by OrderNumber
      order by OrderDateTime
    ) as prev_time,
    LEAD(OrderDateTime,1) over (
      partition by OrderNumber
      order by OrderDateTime
    ) as next_time
  from [Order]
)

SELECT  OrderNumber,
        OrderDateTime
FROM Ordered
WHERE   DATEDIFF(MINUTE,OrderDateTime,next_time) <= 2  --this says if the next value is less than or equal to two minutes away return it
        OR DATEDIFF(MINUTE,prev_time,OrderDateTime) <= 2 --this says if the prev value is less than or equal to 2 minutes away return it

Resultados (Recuerde que agregué una fila):

OrderNumber          OrderDateTime
-------------------- -----------------------
1234                 2012-04-28 09:00:00.000
1234                 2012-04-28 09:01:00.000
1234                 2012-04-28 09:03:00.000
5678                 2012-04-28 09:40:00.000
5678                 2012-04-28 09:42:00.000
5678                 2012-04-28 09:44:00.000
91011                2012-04-28 10:25:00.000
91011                2012-04-28 10:27:00.000