sql >> Databasteknik >  >> RDS >> Sqlserver

Använder SQL Server 2012 LAG

Okej först och främst la jag till en rad för att visa dig var någon annans svar inte fungerar men de har tagit bort det nu.

Nu till logiken i min fråga. Du sa att du vill ha varje rad som ligger inom två minuter från en annan rad. Det betyder att du inte bara måste titta bakåt utan även framåt med LEAD(). I din fråga returnerade du när föregående gång var NULL så det returnerade helt enkelt det första värdet av varje OrderNumber oavsett om det var rätt eller fel. Av en slump behövde de första värdena för vart och ett av dina OrderNumbers returneras tills du kommer till det sista OrderNumber där det gick sönder. Min fråga korrigerar det och borde fungera för alla dina data.

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

Resultat(Kom ihåg att jag lade till en rad):

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



  1. Fel vid laddning av MySQLdb-modul 'Installerade du mysqlclient eller MySQL-python?'

  2. mysql - fulltext index - vad är naturligt språkläge

  3. Kan inte ansluta till SQL Server-databasen i Visual Studio eftersom min databas inte finns där

  4. SQL-funktion som standardparametervärde?