Sql 选择按组排序的最新条目,为最新条目添加用户定义的列
我目前有两个SQL表:Sql 选择按组排序的最新条目,为最新条目添加用户定义的列,sql,sql-server,Sql,Sql Server,我目前有两个SQL表: Employees ID Created RecordID Status ------ ----------------------- ------------ ---------- 1 2020-07-29 12:38:54.070 1 1 2 2020-08-03 14:28:59.803 1 1 3 2020-08-04 13:47:49.427
Employees
ID Created RecordID Status
------ ----------------------- ------------ ----------
1 2020-07-29 12:38:54.070 1 1
2 2020-08-03 14:28:59.803 1 1
3 2020-08-04 13:47:49.427 2 0
及
如何在下面的查询中添加另一个名为Latest
的(用户定义)列,该列可以检查该行是否对应于创建了最新的员工RecordID
编号,并为该行返回字符串true
或false
值?换句话说,如果一行创建的具有与该RecordID
编号对应的所有行的最新时间戳,则该行应为Latest:true
以下是我迄今为止的SQL:
SELECT e.ID, e.Created, e.Status, p.EmployeeID, p.Amount
FROM Employees AS e
JOIN Payments AS p
ON e.ID = p.EmployeeID
以下是预期结果:
ID Created Status EmployeeID Amount Latest
------ --------------------------- ---------- -------------- ---------- ----------
1 2020-07-29 12:38:54.070 1 1 1022 false
1 2020-07-29 12:38:54.070 1 1 1090 false
1 2020-07-29 12:38:54.070 1 1 2105 false
2 2020-08-03 14:28:59.803 1 2 1112 true
2 2020-08-03 14:28:59.803 1 2 1450 true
2 2020-08-03 14:28:59.803 1 2 2923 true
3 2020-08-04 13:47:49.427 0 3 1064 true
谢谢 两名员工可以拥有相同的RecordID
我对期望的结果感到困惑。“最新记录”是雇员表中的最高记录ID吗?付款表中的最高ID?你怎么知道仅仅因为身份证就有最新的付款?(例如,事务可以按顺序提交。)您是否希望有6行、2行、1行或其他内容?请告诉我们您期望的结果,这比反向工程一个单词问题要容易得多。此外,SQL Server没有布尔类型,最好是位(0
/1
/null
)或字(字面上是字符串'true'
/'false'
)。如何识别最新记录?以及它与付款表的关系,因为您仅使用员工id加入?请您添加预期结果并进行更多解释。逻辑不够清晰。请为您的示例添加预期结果。最新付款是创建了最新的的员工记录ID
。请参阅编辑的问题这就是为什么依赖单词问题并假设我们都熟悉您的数据模型会使问题难以回答的原因。这不是“最新付款”,而是“最新创建的员工”。如果您更改了实体名称以试图掩盖问题,则会产生相反的效果。
;WITH x AS
(
SELECT e.ID, e.Created, e.Status, p.EmployeeID, p.Amount,
Latest = CASE DENSE_RANK() OVER (PARTITION BY e.RecordID ORDER BY e.Created DESC)
WHEN 1 THEN 'true' ELSE 'false' END
FROM dbo.Employees AS e
JOIN dbo.Payments AS p
ON e.ID = p.EmployeeID
)
SELECT * FROM x ORDER BY ID;
;WITH x AS
(
SELECT e.ID, e.Created, e.Status, p.EmployeeID, p.Amount,
Latest = CASE DENSE_RANK() OVER (PARTITION BY e.RecordID ORDER BY e.Created DESC)
WHEN 1 THEN 'true' ELSE 'false' END
FROM dbo.Employees AS e
JOIN dbo.Payments AS p
ON e.ID = p.EmployeeID
)
SELECT * FROM x ORDER BY ID;