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

Brug af SQL Server 2012 LAG

Okay, først og fremmest har jeg tilføjet en række for at vise dig, hvor en andens svar ikke virker, men de har slettet det nu.

Nu til logikken i min forespørgsel. Du sagde, at du vil have hver række, der er inden for to minutter af en anden række. Det betyder, at du ikke kun skal kigge bagud, men også fremad med LEAD(). I din forespørgsel returnerede du, da den forrige gang var NULL, så den returnerede simpelthen den første værdi af hvert OrderNumber, uanset om det var rigtigt eller forkert. Ved et tilfælde skulle de første værdier af hvert af dine ordrenumre returneres, indtil du kommer til det sidste ordrenummer, hvor det gik i stykker. Min forespørgsel retter det og burde fungere for alle dine 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

Resultater (Husk, at jeg tilføjede en række):

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. Gruppe- og optællingsværdier for hver post i SQL

  2. SQL Server AlwaysOn Tilgængelighedsgrupper:Installation og konfiguration, del 1

  3. Er der en måde at genskabe en ODI-pakke ved hjælp af ODI Scenario?

  4. TypeORM:Indstil dynamisk databaseskema for EntityManager (eller repositories) ved kørsel?