Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden von SQL Server 2012 LAG

Okay, zuerst habe ich eine Zeile hinzugefügt, um Ihnen zu zeigen, wo die Antwort eines anderen nicht funktioniert, aber sie wurde jetzt gelöscht.

Nun zur Logik in meiner Abfrage. Sie sagten, Sie wollen jede Zeile, die innerhalb von zwei Minuten von einer anderen Zeile entfernt ist. Das heißt, Sie müssen bei LEAD() nicht nur nach hinten, sondern auch nach vorne schauen. In Ihrer Abfrage haben Sie zurückgegeben, als die vorherige Zeit NULL war, sodass einfach der erste Wert jeder Bestellnummer zurückgegeben wurde, unabhängig davon, ob er richtig oder falsch war. Zufälligerweise mussten die ersten Werte jeder Ihrer OrderNumbers zurückgegeben werden, bis Sie zur letzten OrderNumber kamen, an der sie brach. Meine Abfrage korrigiert das und sollte für alle Ihre Daten funktionieren.

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

Ergebnisse (Denken Sie daran, dass ich eine Zeile hinzugefügt habe):

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