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

連続した日付データをグループ化する SQL Server クエリ

    最初のいくつかのテスト データ:

    create table seasons (seasonId int primary key
        , "date" datetime not null unique
        , tariffId int not null)
    
    insert into seasons values (1, '2009-01-01', 1)
    insert into seasons values (2, '2009-01-02', 1)
    insert into seasons values (3, '2009-01-03', 2)
    insert into seasons values (4, '2009-01-04', 3)
    insert into seasons values (5, '2009-01-05', 3)
    insert into seasons values (6, '2009-01-06', 1)
    insert into seasons values (7, '2009-01-07', 1)
    insert into seasons values (8, '2009-01-08', 3)
    -- add a tarrif with a datespan larger than 2
    insert into seasons values (9, '2009-01-09', 4)
    insert into seasons values (10, '2009-01-10', 4)
    insert into seasons values (11, '2009-01-11', 4)
    

    Dave Barker の回答に基づいて、インライン ビュー内に row_number() を追加して、tariId によって最初の最小値、2 番目の最小値などがわかるようにします。 (実際には、1 つの日付に複数のタリフ ID を指定できないため、タリフ ID で分割する必要はありません。)

    SELECT MinValues.Seasonid, MinValues.Date, MaxValues.Date, MaxValues.tariffid 
    FROM (
        SELECT *, row_number() over (partition by tariffId order by "date") as RN 
          FROM [dbo].[Seasons] tbl1
         WHERE NOT EXISTS (SELECT * 
                             FROM [dbo].[Seasons] tbl2 
                            WHERE tbl1.seasonid - tbl2.seasonid = 1 
                              AND tbl1.tariffId = tbl2.tariffId)) as minValues
    JOIN (
         SELECT *, row_number() over (partition by tariffId order by "date") as RN
           FROM [dbo].[Seasons] tbl1
          WHERE NOT EXISTS (SELECT *
                              FROM [dbo].[Seasons] tbl2 
                             WHERE tbl2.seasonid - tbl1.seasonid = 1 
                               AND tbl1.tariffId = tbl2.tariffId)) as maxValues
    ON MinValues.TariffId = MaxValues.tariffId
    and MinValues.RN = MaxValues.RN
    order by MinValues.Date
    

    結果:

    1   2009-01-01 00:00:00.000 2009-01-02 00:00:00.000 1
    3   2009-01-03 00:00:00.000 2009-01-03 00:00:00.000 2
    4   2009-01-04 00:00:00.000 2009-01-05 00:00:00.000 3
    6   2009-01-06 00:00:00.000 2009-01-07 00:00:00.000 1
    8   2009-01-08 00:00:00.000 2009-01-08 00:00:00.000 3
    9   2009-01-09 00:00:00.000 2009-01-11 00:00:00.000 4
    


    1. フィルタwhere句でOracle外部結合を使用する方法

    2. IF条件を使用したMySQLUPDATE

    3. MySQLのnow()+1日

    4. OracleSql開発者でExplainPlanを表示するにはどうすればよいですか?