Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Triển khai cte bắt buộc cho dữ liệu phân cấp

Bạn có thể thực hiện ROW_NUMBER() với PARTITION BY và sau đó tự tham gia với rn =rn + 1 và thực hiện DATEDIFF dựa trên đó bạn có thể nhóm các kết quả của bạn.

Hãy thử một cái gì đó như thế này

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiệu suất máy chủ SQL - Kiểm tra trong đám mây

  2. Làm cách nào để quản lý lượng dữ liệu khổng lồ bằng cách sử dụng filestream vì chỉ hỗ trợ các đường dẫn cục bộ để lưu trữ dữ liệu?

  3. Những yếu tố nào có thể gây ra việc biên dịch thủ tục đã lưu trữ trên SQL Server?

  4. Sắp xếp khóa chính

  5. Cách thêm số dòng trong SQL Server Management Studio (SSMS) - Hướng dẫn SQL Server / TSQL Phần 11