Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Utilizzo di SQL Server 2012 LAG

Ok, prima di tutto ho aggiunto una riga per mostrarti dove la risposta di qualcun altro non funziona ma ora l'hanno cancellata.

Ora per la logica nella mia query. Hai detto di volere ogni riga che si trova entro due minuti da un'altra riga. Ciò significa che devi guardare non solo indietro, ma anche in avanti con LEAD(). Nella tua query, hai restituito quando l'ora precedente era NULL, quindi ha semplicemente restituito il primo valore di ogni OrderNumber indipendentemente dal fatto che fosse giusto o sbagliato. Per caso, i primi valori di ciascuno dei tuoi OrderNumbers dovevano essere restituiti fino a quando non arrivavi all'ultimo OrderNumber in cui si è rotto. La mia query lo corregge e dovrebbe funzionare per tutti i tuoi dati.

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

Risultati(Ricorda che ho aggiunto una riga):

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