sql >> Database >  >> RDS >> Sqlserver

SQL Server 2012 LAG gebruiken

Oké, allereerst heb ik een rij toegevoegd om je te laten zien waar het antwoord van iemand anders niet werkt, maar ze hebben het nu verwijderd.

Nu voor de logica in mijn vraag. Je zei dat je elke rij wilt die binnen twee minuten van een andere rij is. Dat betekent dat je met LEAD() niet alleen achteruit, maar ook vooruit moet kijken. In uw zoekopdracht keerde u terug toen de vorige keer NULL was, dus het retourneerde gewoon de eerste waarde van elk OrderNumber, ongeacht of het goed of fout was. Toevallig moesten de eerste waarden van elk van uw OrderNumbers worden geretourneerd totdat u bij het laatste OrderNumber kwam waar het brak. Mijn vraag corrigeert dat en zou voor al je gegevens moeten werken.

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

Resultaten (onthoud dat ik een rij heb toegevoegd):

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. hoe meerdere waarden in een enkel veld in mysql in te voegen

  2. PDOException SQLSTATE [HY000] [2002] Time-out bij verbinding op mijn lokale computer

  3. Een record verwijderen in DataGridView

  4. MySQL:meerdere waar-voorwaarden combineren