sql >> データベース >  >> RDS >> Sqlserver

SQL Server 2012 LAG の使用

    わかりました。まず、他の誰かの回答が機能しない場所を示すために行を追加しましたが、現在は削除されています。

    次に、クエリのロジックについて説明します。別の行から 2 分以内にある各行が必要だと言いました。つまり、後方だけでなく、LEAD() を使用して前方にも目を向ける必要があります。クエリでは、前回が NULL のときに返されたため、正しいか間違っているかに関係なく、各 OrderNumber の最初の値が返されました。偶然にも、各 OrderNumber の最初の値は、壊れた最後の OrderNumber に到達するまで返される必要がありました。私のクエリはそれを修正し、すべてのデータに対して機能するはずです.

    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
    

    結果 (行を追加したことを思い出してください):

    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. Oracle SQL Developerでデータベース名を照会する方法は?

    2. SQLでcase条件文との合計がどのように機能するか

    3. JavaクラスからOracleプロシージャを実行中にブロックされたスレッド

    4. エラー1022-書き込めません。テーブル内の重複キー