如何在SQL server中查找记录中的更改
我有一张桌子,上面有学生信息如何在SQL server中查找记录中的更改,sql,sql-server,Sql,Sql Server,我有一张桌子,上面有学生信息 +==========================================+ | ID | Department | Date | +==========================================+ | 001 | English | Feb 3 2017 | | 001 | English | Feb 4 2017 | | 001
+==========================================+
| 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
002和003无
2004年
当我尝试应用中提到的逻辑时,分区不起作用,因为学生可以再次回到同一个系。请提供帮助。您可以使用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
演示链接:
参考链接:
对于旧版本,可以使用外部应用
您可以使用LEAD window函数-对于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
演示链接:
参考链接:
对于旧版本,可以使用外部应用
你所描述的内容和你所呈现的结果是不同的,这让人感到困惑。@RameshKharbuja我试图找到用户在部门偏好发生变化的记录。请让我知道是什么引起了混乱。虽然学生1和4的数学改为英语,但你的结果中没有关于英语的行。为什么ID 004记录在输出中被跳过,他在4月9日将他的系从数学改为英语?@RameshKharbuja。考虑到用户1,他的偏好已从英语-科学改为2月4日。同样地,从科学数学到3月1日,他一直喜欢数学,直到4月2日,之后他改学英语。因此,示例结果显示了上面给出的3行。您描述的内容和作为结果显示的内容是不同的,这会造成混淆。@RameshKharbuja我正在尝试查找部门中用户偏好发生变化的记录。请让我知道是什么引起了混乱。虽然学生1和4的数学改为英语,但你的结果中没有关于英语的行。为什么ID 004记录在输出中被跳过,他在4月9日将他的系从数学改为英语?@RameshKharbuja。考虑到用户1,他的偏好已从英语-科学改为2月4日。同样地,从科学数学到3月1日,他一直喜欢数学,直到4月2日,之后他改学英语。因此,示例结果显示了上面给出的3行。仅SQL Server 2012及以上版本。仅SQL Server 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
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