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

各観測の最小日付を確認し、フラグを動的に更新する方法

    これは元の質問なので、ここに回答を投稿します。ループをすべて一緒に捨てることをお勧めします。これは、2 つの CTE と ZERO ループを使用する方法です。

    declare @table table (ID int, StartDate date, EndDate date)
    Insert Into @table
    (
        ID
        , StartDate
        , EndDate
    )
    Values
    (1,     '2017-01-01',    '2017-02-01'),
    (1,     '2017-01-09',    '2017-01-28'),
    (1,     '2017-04-01',    '2017-04-30'),
    (1,     '2017-04-05',    '2017-05-20'),
    (1,     '2017-04-20',    '2017-06-12'),
    (2,     '2017-06-02',    '2017-06-20'),
    (2,     '2017-06-14',    '2017-07-31'),
    (2,     '2017-06-14',    '2017-07-31'),
    (2,     '2017-06-19',    '2017-07-31'),
    (2,     '2017-06-19',    '2017-07-31')
    
    
    ;with cte as(
    select
        t1.ID
        ,t1.StartDate
        ,t1.EndDate
        ,DT = (select min(StartDate) from @table t2  where t2.StartDate > DATEADD(day,30,t1.StartDate))
    from
        @table t1),
    
    cte2 as(
    select
        ID
        ,StartDate
        ,EndDate
        ,dense_rank() over (order by isnull(DT,(select max(StartDate) from cte))) as Flag
    from
        cte)
    
    select 
        ID
        ,StartDate
        ,EndDate
        ,case when Flag % 2 = 0 then 2 else Flag % 2 end as Flag
    from cte2
    


    1. SQLServerのカーソルタイプ-ローカルカーソルとグローバルカーソルの違いは何ですか。 SQLServerチュートリアル/TSQLチュートリアル

    2. 結果から n 番目の値または NULL を返す

    3. SQL Server Compact Edition 3.5 SP2 x64 がインストールされているかどうかを検出していますか?

    4. SQL CASE とローカル変数