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

テーブルで欠落している時間間隔を見つける

    以下は機能するはずであり、デバイスIDのレコードを1つだけ返すわけではありません。

    その要点は

    • 各レコードにDateの順に行番号を追加します DeviceIDごとに再起動します 。
    • selfと結合して、2つの元の行の組み合わせで構成される行で結果を作成します。各行の列間の関係は、行番号(+1)とDeviceIDです。 。
    • 関連するDateがある行のみを保持します 15分以上です。

    SQLステートメント

    ;WITH t AS (
      SELECT  *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
      FROM    TestTable
    )  
    SELECT  t1.DeviceID, t1.Date, t2.Date
    FROM    t t1
            INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
    WHERE   DATEDIFF(MINUTE, t1.Date, t2.Date) > 15        
    

    テストスクリプト

    ;WITH TestTable (ID, DeviceID, Date, Value) AS (
      SELECT 1, 3, '2011-08-24 00:00:00', 0.51 UNION ALL
      SELECT 2, 3, '2011-08-24 00:15:00', 2.9 UNION ALL
      SELECT 3, 3, '2011-08-24 00:30:00', 0 UNION ALL
      SELECT 4, 3, '2011-08-24 00:45:00', 7.1 UNION ALL
      SELECT 5, 3, '2011-08-24 01:00:00', 1.05 UNION ALL
      SELECT 6, 3, '2011-08-24 03:15:00', 3.8 
    )
    , t AS (
      SELECT  *, rn = ROW_NUMBER() OVER (PARTITION BY DeviceID ORDER BY Date)
      FROM    TestTable
    )  
    SELECT  t1.DeviceID, t1.Date, t2.Date
    FROM    t t1
            INNER JOIN t t2 ON t2.DeviceID = t1.DeviceID AND t2.rn = t1.rn + 1
    WHERE   DATEDIFF(MINUTE, t1.Date, t2.Date) > 15        
    



    1. SalesforceでSQLServerを使用するためのヒント

    2. mysqlのifnullとcolesceの違いは何ですか?

    3. Oracle:テーブルは常にドロップテーブルの後に存在します

    4. ON CONFLICT句でplpgsql変数名を明確にする方法は?