如何跟踪SQL Server中记录的更改?
下表列出了所有学生的跟踪记录如何跟踪SQL Server中记录的更改?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,下表列出了所有学生的跟踪记录 |==========================================| | 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 | Science | Apr 2 2017 |
| 001 | Maths | Apr 7 2017 |
| 002 | Maths | Feb 1 2017 |
| 002 | Maths | Apr 7 2017 |
| 003 | Maths | Apr 3 2017 |
| 004 | Science | Feb 1 2017 |
| 004 | Maths | Apr 7 2017 |
|==========================================|
就在学生换系之前,我需要取以前的记录。对于上面的示例,返回的记录集应该是
对于001,
| 001 | English | Feb 4 2017 |
| 001 | Science | Apr 2 2017 |
用于002和003
不变
对于004
| 004 | Science | Feb 1 2017 |
也有可能同一用户可以更改回同一部门。例如,user001可以从a部门更改为b部门,再更改为c部门,再更改为a部门。我读过关于T-SQL发送和接收的文章。但不确定这在这种情况下是否有帮助。请提供帮助。这可以通过在需要跟踪的表上创建插入/更新后触发器来完成。使用sql server中插入/删除的逻辑表,可以跟踪表上新插入和修改的字段 插入(逻辑表):它将为您提供新插入记录/更新值(列值)的详细信息
已删除(逻辑表):它将在字段被修改/删除之前为您提供字段的旧值。一种方法是使用带分区的
行数
函数来检测部门
列的值何时更改
样本数据
DECLARE @T TABLE (ID int, Department nvarchar(100), dt date);
INSERT INTO @T (ID, Department, dt) VALUES
(1, 'English', 'Feb 3 2017'),
(1, 'English', 'Feb 4 2017'),
(1, 'Science', 'Mar 1 2017'),
(1, 'Science', 'Apr 2 2017'),
(1, 'Maths ', 'Apr 7 2017'),
(2, 'Maths ', 'Feb 1 2017'),
(2, 'Maths ', 'Apr 7 2017'),
(3, 'Maths ', 'Apr 3 2017'),
(4, 'Science', 'Feb 1 2017'),
(4, 'Maths ', 'Apr 7 2017');
查询
WITH
CTE
AS
(
SELECT
ID
,Department
,dt
,ROW_NUMBER() OVER (PARTITION BY ID, Department ORDER BY dt DESC) AS rnPart
,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY dt DESC) AS rnID
FROM @T
)
SELECT
ID
,Department
,dt
FROM CTE
WHERE
rnPart = 1
AND rnID <> 1
ORDER BY
ID
,dt
;
我对此不是很确定,但您可以在存储过程的概念方面获得帮助。它们是数据库的一部分。您可以在查询时设置显示SQL Server的版本是什么?我不明白;是要查询表以查找这些记录,还是要在插入或更新后立即获取这些记录?@GiorgosAltanis每当部门在历史记录中发生更改时,都必须获取记录集。和001一样,该系已从英语科学系改为英语科学系,日期为2月4日。同样,他也从科学-数学改为4月4日。这适用于所有人IDs@VladimirBaranov版本是2012So,现在您有了答案,关于发送和接收是什么?重命名为
dt
todate
,以匹配Poppy的列名。干得好@乔治萨尔塔尼斯,这只是一个例子。我不喜欢在列名中使用保留字。我理解(并且同意)。当我编辑你的答案时,你还没有提供示例代码,所以我想确保OP明白这个解决方案是有效的。@VladimirBaranov如果学生从A系(过去)再次转到A系,分区会如何工作。@Poppy,你是说从A到B,然后从B回到A,然后再到C?在这种情况下,我的查询将只返回A的最后一个日期。它不会返回带A的两行。我认为,如果您问另一个问题,并使用涵盖所有重要案例的更广泛的样本数据,会更好。如果我没有弄错的话,这个问题会很不一样,也会更复杂。
+----+------------+------------+
| ID | Department | dt |
+----+------------+------------+
| 1 | English | 2017-02-04 |
| 1 | Science | 2017-04-02 |
| 4 | Science | 2017-02-01 |
+----+------------+------------+