首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查找SQL server中记录的更改

如何查找SQL server中记录的更改
EN

Stack Overflow用户
提问于 2017-04-10 07:02:12
回答 1查看 126关注 0票数 1

我有一张桌子上有学生的信息。

代码语言:javascript
复制
+==========================================+
| 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

代码语言:javascript
复制
| 001     | English         | Feb 4 2017   |
| 001     | Science         | Mar 1 2017   |
| 001     | Maths           | Apr 2 2017   |

002和003 Nothing

for 004

代码语言:javascript
复制
| 004     | Science         | Mar 1 2017   |
| 004     | Maths           | Apr 7 2017   |

当我尝试应用这里中提到的逻辑时,分区不起作用,因为学生可以再次回到同一个部门。帮帮忙吧。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-10 07:19:48

您可以使用LEAD窗口函数-用于SQL 2012及更高版本.

代码语言:javascript
复制
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

代码语言:javascript
复制
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.Department
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43316743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档