【发布时间】:2021-03-11 16:18:39
【问题描述】:
我有一个名为 Employee_audit 的表,具有以下架构,
| emp_audit_id | eid | name | salary |
|---|---|---|---|
| 1 | 1 | Daniel | 1000 |
| 2 | 1 | Dani | 1000 |
| 3 | 1 | Danny | 3000 |
我的目标是编写一个 SQL 查询,它将以以下格式返回,同时考虑到第一行也从 null 更改为值。
| columnName | oldValue | newValue |
|---|---|---|
| name | null | Daniel |
| salary | null | 1000 |
| name | Daniel | Dani |
| name | Dani | Danny |
| salary | 1000 | 3000 |
我已经编写了下面的 SQL 查询,
WITH cte AS
(
SELECT empid,
name,
salary,
rn=ROW_NUMBER()OVER(PARTITION BY empid ORDER BY emp_audit_id)
FROM Employee_audit
)
SELECT oldname=CASE WHEN c1.Name=c2.Name THEN '' ELSE C1.Name END,
newname=CASE WHEN c1.Name=c2.Name THEN '' ELSE C2.Name END,
oldsalary=CASE WHEN c1.salary=c2.salary THEN NULL ELSE C1.salary END,
newsalary=CASE WHEN c1.salary=c2.salary THEN NULL ELSE C2.salary END
FROM cte c1 INNER JOIN cte c2
ON c1.empid=c2.empid AND c2.RN=c1.RN + 1
但它以以下格式给出结果
| oldname | newname | oldsalary | newsalary |
|---|---|---|---|
| Daniel | Dani | null | null |
| Dani | Danny | 1000 | 3000 |
你能回答我吗,我怎样才能得到所需的结果。
【问题讨论】:
-
您已经标记了 2 个不同的数据库 mysql 和 sql-server。你确定你需要他们两个的解决方案吗?
-
请只标记感兴趣的关系型数据库...而不是多个。而且,如果您将示例数据显示为 DDL+DML,那么人们可以更轻松地提供帮助。
-
你想做什么?哪个数据库?
ROW_NUMBER()不会给你集合中的上一个或下一个值,这就是LEAD()或LAG()会做的。所有这些功能都添加到 MySQL 8 中,因此您要么要求 SQL Server,要么特别要求 MySQL 8 -
SQL Server 自 2005 年以来具有更改跟踪功能,自 2016 年以来具有时态表,基本上在所有受支持的版本中。您可以创建比
Employee_audit更好的解决方案。至于你想要的format,没有办法确定哪个更改是指哪个行(主键)。 -
@Techie321 你想要 SQL 和 T-SQL 标签,它们确实是问题所在。 SQL Server 只是 RDBMS,但 T-SQL 是您正在编写查询的内容。
标签: sql sql-server tsql