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

階層データに必要な cte 実装

    ROW_NUMBER() を実行できます PARTITION BY で 次に、rn =rn + 1 で自己結合を行い、DATEDIFF を実行します。 これに基づいて結果をグループ化できます。

    このようなことを試してください

    DECLARE @Rules TABLE(RuleId  INT,Name CHAR(3),    StartDate DATE,           EndDate DATE)
    
    INSERT INTO @Rules VALUES
    (3 ,'TP3', '3/18/2015', '11/28/2015'),
    (3 ,'TP3', '11/28/2015', '4/30/2016'),
    (3 ,'TP3', '4/30/2016', '10/5/2016'),
    (3 ,'TP3', '10/25/2016', '11/15/2016'),
    (3 ,'TP3', '11/15/2016', null) 
    
    
    ;WITH CTE AS 
    (
    SELECT ROW_NUMBER() OVER(PARTITION BY RuleID ORDER BY StartDate) rn,*
    FROM @Rules
    ), CTE2 AS
    (
    SELECT ISNULL(DATEDIFF(day,C1.EndDate,C2.StartDate),0) diff,C1.*
    FROM CTE C1 
    LEFT JOIN CTE C2 ON C1.rn + 1 = C2.rn
     AND C1.RuleId = C2.RuleId
    )
    SELECT RuleId,Name,MIN(StartDate)  StartDate,NULLIF(MAX(CASE WHEN EndDate IS NULL THEN '2999/12/31' ELSE EndDate END),'2999/12/31') EndDate
    FROM
    (
    SELECT C2.Diff,C1.RuleId,C1.Name,C1.StartDate,C1.EndDate
    FROM CTE2 C1
    CROSS APPLY (SELECT ISNULL(SUM(Diff),0) Diff FROM CTE2 C2 WHERE C1.StartDate > C2.StartDate AND C1.RuleId = C2.RuleId) C2
    ) C
    GROUP BY RuleId,Name,Diff
    ORDER BY RuleId,Diff
      


    1. SQLで引用符を処理するにはどうすればよいですか?

    2. コマンドラインを使用してmysqlユーザーのパスワードを変更する

    3. LEFT JOINを使用してクエリを実行すると、カウントが0の行が返されません。

    4. OracleのTIMESTAMPWITHTIME ZONEに相当するMySQLはありますか?