假設我在 SSMS 中有表 A:
| 員工 | 教學 | 開始日期 | 結束日期 |
|---|---|---|---|
| 123 | 科學 | 2001 年 1 月 1 日 | 2001 年 5 月 10 日 |
| 123 | 科學 | 2001 年 8 月 20 日 | 2001 年 12 月 16 日 |
| 123 | 科學 | 2002 年 1 月 18 日 | 2002 年 5 月 8 日 |
| 123 | 歷史 | 2002 年 8 月 15 日 | 2002 年 12 月 10 日 |
| 123 | 科學 | 2003 年 1 月 3 日 | 2003 年 5 月 6 日 |
| 123 | 科學 | 2003 年 8 月 1 日 | 2003 年 12 月 3 日 |
我希望我的輸出如下
| 員工 | 教學 | 開始日期 | 結束日期 |
|---|---|---|---|
| 123 | 科學 | 2001 年 1 月 1 日 | 2002 年 5 月 8 日 |
| 123 | 科學 | 2003 年 1 月 3 日 | 2003 年 12 月 3 日 |
| 123 | 歷史 | 2002 年 8 月 15 日 | 2002 年 12 月 10 日 |
本質上,我想在每個塊中獲得 EMPLOYEE 和 TEACHING 的第一個 START_DATE 和最后一個 END_DATE。我試圖解決這個問題的一種方法是創建兩個等級,一個 ASC 和一個 DESC,但它會給我 1/1/2001 - 12/3/2003 的科學,這不是我想要的。
正如有人已經評論過的那樣,歷史正在打破鏈條。
uj5u.com熱心網友回復:
我建議以下解決方案:
DECLARE @T TABLE
(
EMPLOYEE int,
TEACHING varchar(MAX),
START_DATE datetime2,
END_DATE datetime2
)
INSERT @T VALUES
(123, 'SCIENCE', '1/1/2001', '5/10/2001'),
(123, 'SCIENCE', '8/20/2001', '12/16/2001'),
(123, 'SCIENCE', '1/18/2002', '5/8/2002'),
(123, 'HISTORY', '8/15/2002', '12/10/2002'),
(123, 'SCIENCE', '1/3/2003', '5/6/2003'),
(123, 'SCIENCE', '8/1/2003', '12/3/2003'),
(124, 'SCIENCE', '1/1/2001', '5/10/2001'),
(124, 'SCIENCE', '8/20/2001', '12/16/2001'),
(124, 'SCIENCE', '1/18/2002', '5/8/2002'),
(124, 'HISTORY', '8/15/2002', '12/10/2002'),
(124, 'SCIENCE', '1/3/2003', '5/6/2003'),
(124, 'SCIENCE', '8/1/2003', '12/3/2003');
WITH Discriminated AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY EMPLOYEE ORDER BY START_DATE)-ROW_NUMBER() OVER (PARTITION BY EMPLOYEE, TEACHING ORDER BY START_DATE) Discriminator
FROM @T
)
SELECT EMPLOYEE, TEACHING, MIN(START_DATE) START_DATE, MAX(END_DATE) END_DATE
FROM Discriminated
GROUP BY EMPLOYEE, TEACHING, Discriminator
ORDER BY EMPLOYEE, START_DATE
我還假設您想分別計算每個 EMPLOYEE。訣竅是標記連續的組(參見 CTE 中的查詢)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/514569.html
