我有一张桌子上有学生的信息。
+==========================================+
| ID | Department | Date |
+==========================================+
| 001 | English | Feb 3 2017 |
| 001 | English | Feb 4 2017 |
| 001 | Science | Mar 1 2017 |
| 001 | Maths | Mar 2 2017 |
| 001 | Maths | Mar 21 2017 |
| 001 | Maths | Apr 2 2017 |
| 001 | English | Apr 7 2017 |
| 002 | Maths | Feb 1 2017 |
| 002 | Maths | Apr 7 2017 |
| 003 | Maths | Apr 3 2017 |
| 003 | Maths | Apr 7 2017 |
| 004 | Science | Feb 1 2017 |
| 004 | Science | Mar 1 2017 |
| 004 | Maths | Apr 7 2017 |
| 004 | English | Apr 9 2017 |
+==========================================+在上表中,每当学生的学系偏好发生变化时,我都需要得到学生记录的列表。还有一个机会,学生可以换回同一个系。因此,对于上面的示例数据,返回的记录列表为
学生 001
| 001 | English | Feb 4 2017 |
| 001 | Science | Mar 1 2017 |
| 001 | Maths | Apr 2 2017 |002和003 Nothing
for 004
| 004 | Science | Mar 1 2017 |
| 004 | Maths | Apr 7 2017 |当我尝试应用这里中提到的逻辑时,分区不起作用,因为学生可以再次回到同一个部门。帮帮忙吧。
发布于 2017-04-10 07:19:48
您可以使用LEAD窗口函数-用于SQL 2012及更高版本.
DECLARE @SampleData AS TABLE
(
Id int,
Department varchar(20),
[Date] date
)
INSERT INTO @SampleData
VALUES (1,'English', 'Feb 3 2017'),(1,'English', 'Feb 4 2017'),(1,'Science', 'Mar 1 2017'),
(1,'Maths', 'Mar 2 2017'),(1,'Maths', 'Mar 3 2017'),(1,'English', 'Mar 7 2017'),
(2,'Maths', 'Feb 3 2017'),(2,'Maths', 'Feb 4 2017'),
(3,'Maths', 'Feb 3 2017'), (3,'Maths', 'Feb 4 2017'),
(4,'Science', 'Feb 1 2017'), (4,'Science', 'Feb 2 2017'), (4,'Maths', 'Feb 3 2017'),(4,'English', 'Feb 4 2017')
;WITH temps AS
(
SELECT sd.*, LEAD(sd.Department, 1) OVER(PARTITION BY id ORDER BY sd.[Date]) AS NextDepartment
FROM @SampleData sd
)
SELECT t.id, t.Department,t.[Date] FROM temps t
WHERE t.Department != t.NextDepartment演示链接:雷克斯试验器
参考链接:铅- MDSN
对于旧版本,您可以使用OUTER APPLY
SELECT sd.*
FROM @SampleData sd
OUTER APPLY
(
SELECT TOP 1 * FROM @SampleData sd2 WHERE sd.Id = sd2.Id AND sd.[Date] < sd2.[Date]
) nextDepartment
WHERE sd.Department != nextDepartment.Departmenthttps://stackoverflow.com/questions/43316743
复制相似问题