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

間隔が 15 日未満の行をグループ化し、最小/最大の日付を割り当てます

    コメントで述べたように、 LAG を使用できます このための関数。基本的な考え方は、各行に 0/1 の値を割り当てることです。前の行から 15 日以内の場合は 0、それ以外の場合は 1 です。次に SUM() OVER () を使用します。 1 と 0 をグループ化に使用できる数値に変換します。

    これにより、はるかに長い日付範囲がグループ化される可能性があることに注意してください。 01-0101-1101-2102-0102-11 最初と最後の日付が 15 日以上離れていますが、グループ化されます。

    DECLARE @T TABLE (HASTA_ID INT, PROTOKOL_ID INT, STARTDATE DATE, ENDDATE DATE);
    INSERT INTO @T VALUES
    (273065, 11, '2018-01-24', '2018-01-30'),
    (273065, 12, '2018-01-25', '2018-02-10'),
    (273065, 13, '2018-01-30', '2018-01-30'),
    (273065, 14, '2018-02-23', '2018-02-28'),
    (273065, 15, '2018-03-21', '2018-03-29'),
    (273065, 16, '2018-05-03', '2018-05-04'),
    (273065, 17, '2018-05-03', '2018-05-08'),
    (273065, 18, '2018-05-14', '2018-05-22'),
    (273065, 19, '2018-05-22', '2018-05-23'),
    (273065, 20, '2018-09-20', '2018-09-30');
    
    WITH CTE1 AS (
        SELECT *, CASE WHEN LAG(STARTDATE) OVER (PARTITION BY HASTA_ID ORDER BY STARTDATE) >= DATEADD(DAY, -14, STARTDATE) THEN 0 ELSE 1 END AS CHG
        FROM @T
    ), CTE2 AS (
        SELECT *, SUM(CHG) OVER (PARTITION BY HASTA_ID ORDER BY STARTDATE) AS GRP
        FROM CTE1
    )
    SELECT *,
        MIN(STARTDATE) OVER (PARTITION BY HASTA_ID, GRP) AS EX_STARTDATE,
        MAX(ENDDATE) OVER (PARTITION BY HASTA_ID, GRP) AS EX_ENDDATE
    FROM CTE2
    ORDER BY HASTA_ID, STARTDATE
    

    DB Fiddle のデモ




    1. PHPデータベースの出力が正しい方法を示していない

    2. 正しいMySQL接続文字列を形成する方法は?

    3. MYSQLが誤ったINTEGER値エラーを切り捨てました

    4. 帆の喫水線のormに複数のテーブルを配置する