sql >> Database teknologi >  >> RDS >> Sqlserver

Påkrævet cte-implementering for hierarkiske data

Du kan lave en ROW_NUMBER() med PARTITION BY og lav derefter en selv-join med rn =rn + 1 og lav en DATEDIFF ud fra hvilket du kan gruppere dine resultater.

Prøv noget som dette

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. Hvordan fjerner man dobbelte anførselstegn omkring teksten, mens man importerer en CSV-fil?

  2. Kan ikke åbne SQLite-database fra SQLIte Helper Oncreate, når OnCreate udløses ved at åbne databasen for første gang

  3. sammenføjning af to borde med flere forhold i skinner

  4. Hvordan indstilles korrekte attributnavne til et aggregeret json-resultat med GROUP BY-sætning?