鑒于此表
CREATE TABLE Table1
(
[Classroom] int,
[CourseName] varchar(8),
[Lesson] varchar(9),
[StartTime] char(4),
[EndTime] char(4)
);
INSERT INTO Table1
([Classroom], [CourseName], [Lesson], [StartTime], [EndTime])
VALUES
(1001, 'Course 1', 'Lesson 1', '0800', '0900'),
(1001, 'Course 1', 'Lesson 2', '0900', '1000'),
(1001, 'Course 1', 'Lesson 3', '1000', '1100'),
(1001, 'Course 1', 'Lesson 6', '1100', '1200'),
(1001, 'Course 2', 'Lesson 10', '1100', '1200'),
(1001, 'Course 2', 'Lesson 11', '1200', '1300'),
(1001, 'Course 1', 'Lesson 4', '1300', '1400'),
(1001, 'Course 1', 'Lesson 5', '1400', '1500');
我的查詢
WITH A AS
(
SELECT
ClassRoom,
CourseName,
StartTime,
EndTime,
PrevCourse = LAG(CourseName, 1, CourseName) OVER (ORDER BY StartTime)
FROM
Table1
), B AS
(
SELECT
ClassRoom,
CourseName,
StartTime, EndTime,
Ranker = SUM(CASE WHEN CourseName = PrevCourse THEN 0 ELSE 1 END)
OVER (ORDER BY StartTime, CourseName)
FROM
A
)
SELECT B.*
FROM B;
我得到這個結果:
ClassRoom CourseName StartTime EndTime Ranker
---------------------------------------------
1001 Course 1 0800 0900 0
1001 Course 1 0900 1000 0
1001 Course 1 1000 1100 0
1001 Course 1 1100 1200 0
1001 Course 2 1100 1200 1
1001 Course 2 1200 1300 1
1001 Course 1 1300 1400 2
1001 Course 1 1400 1500 2
請專注于列排名。如果我沒有誤解,在當前課程與上一課程不同的每一行,然后 sum(1); 下一行,當前課程 == 上一課程,然后是 sum(0),所以我對排名的期望應該是:(0,0,0,0), (1,1), (1,1) 但它給我(0,0,0,0),(1,1),(2,2)。
為什么最后我得到 (2, 2) ?我錯過了什么嗎?
uj5u.com熱心網友回復:
表達方式:
CASE WHEN CourseName = PrevCourse THEN 0 ELSE 1 END
與 不1
同時回傳。CourseName
PrevCourse
如果您在里面再添加一列,您會看得更清楚B
:
B AS (
SELECT ClassRoom
, CourseName
, StartTime
, EndTime
, CASE WHEN CourseName = PrevCourse THEN 0 ELSE 1 END flag -- check this
, Ranker = SUM(CASE WHEN CourseName = PrevCourse THEN 0 ELSE 1 END)
OVER (ORDER BY StartTime, CourseName)
FROM A
)
如果您想獲得 (0,0,0,0), (1,1), (1,1) 的結果,您應該在該列中添加一個PARTITION BY
子句:OVER
Ranker
Ranker = SUM(CASE WHEN CourseName = PrevCourse THEN 0 ELSE 1 END)
OVER (PARTITION BY CourseName ORDER BY StartTime)
請參閱演示。
uj5u.com熱心網友回復:
似乎,因為你有比較不同課程名稱的基本邏輯,你認為sum
也會這樣做。它不會。對于 Starttime=1300 行,case
對從 0900 到 1300 的所有 7 行計算運算式。1100 和 1300 的 case=1,因此總和回傳 2。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/495811.html
上一篇:選擇表的COUNT并選擇自身