【发布时间】:2021-12-29 14:46:09
【问题描述】:
我有一张表,我想获取每个组的最新条目。这是表格:
DocumentStatusLogs 表
|ID| DocumentID | Status | DateCreated |
| 2| 1 | S1 | 7/29/2011 |
| 3| 1 | S2 | 7/30/2011 |
| 6| 1 | S1 | 8/02/2011 |
| 1| 2 | S1 | 7/28/2011 |
| 4| 2 | S2 | 7/30/2011 |
| 5| 2 | S3 | 8/01/2011 |
| 6| 3 | S1 | 8/02/2011 |
表格将按DocumentID 分组,并按DateCreated 降序排序。对于每个DocumentID,我想获取最新状态。
我的首选输出:
| DocumentID | Status | DateCreated |
| 1 | S1 | 8/02/2011 |
| 2 | S3 | 8/01/2011 |
| 3 | S1 | 8/02/2011 |
-
是否有任何聚合函数可以仅从每个组中获取顶部?请参阅下面的伪代码
GetOnlyTheTop:SELECT DocumentID, GetOnlyTheTop(Status), GetOnlyTheTop(DateCreated) FROM DocumentStatusLogs GROUP BY DocumentID ORDER BY DateCreated DESC 如果不存在这样的功能,有什么方法可以实现我想要的输出吗?
- 或者首先,这可能是由未规范化的数据库引起的吗?我在想,既然我要找的只是一行,那
status是否也应该位于父表中?
更多信息请查看父表:
当前Documents 表
| DocumentID | Title | Content | DateCreated |
| 1 | TitleA | ... | ... |
| 2 | TitleB | ... | ... |
| 3 | TitleC | ... | ... |
父表是否应该这样,以便我可以轻松访问其状态?
| DocumentID | Title | Content | DateCreated | CurrentStatus |
| 1 | TitleA | ... | ... | s1 |
| 2 | TitleB | ... | ... | s3 |
| 3 | TitleC | ... | ... | s1 |
更新 我刚刚学会了如何使用“应用”,这样可以更轻松地解决此类问题。
【问题讨论】:
-
要更详细地讨论和比较可能的解决方案,我建议阅读 dba.se 上的类似问题:Retrieving n rows per group。
-
我看了帖子试了一下。使用 按 StoreID 分组 产生错误。
-
这能回答你的问题吗? Select first row in each GROUP BY group?
标签: sql sql-server tsql sql-server-2005 greatest-n-per-group