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 |
UPDATE 我刚刚学习了如何使用“应用”,这使得解决此类问题更加容易。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在SQL中,确实没有直接名为GetOnlyTheTop
的函数,但你可以使用子查询、窗口函数或者自连接来实现你的需求。这里提供一个使用窗口函数ROW_NUMBER()
的方法,它是SQL Server、PostgreSQL等数据库中常用的功能,用于为每个分组内的行分配一个唯一的、连续的整数,然后你可以选择每个组的第一行(即最新状态)。
以下是使用窗口函数实现你所需输出的SQL示例:
WITH RankedLogs AS (
SELECT
DocumentID,
Status,
DateCreated,
ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn
FROM DocumentStatusLogs
)
SELECT
DocumentID,
Status,
DateCreated
FROM RankedLogs
WHERE rn = 1
ORDER BY DateCreated DESC;
这段代码首先创建了一个名为RankedLogs
的临时结果集,其中包含每条记录及其在相应DocumentID
组内的排名(按DateCreated
降序)。然后,从这个临时结果集中选择排名为1(即每个DocumentID
的最新记录)的行。
至于你的更新问题,了解如何使用“应用”(我假设你可能是指数据库视图或存储过程等数据库应用方式)确实可以简化复杂查询的重复使用,这是个很好的学习方向。
至于表规范化的问题,这取决于你的具体业务场景和数据处理需求。如果文档的状态经常变化,并且你需要跟踪这些变化的历史,那么保持当前的DocumentStatusLogs
表设计是有意义的,因为它允许你审计状态更改历史。同时,在Documents
表中添加一个CurrentStatus
字段以快速获取当前状态也是一个常见的优化策略,但这需要确保有一个机制来维护这个字段的准确性,比如通过触发器或者应用程序逻辑在状态变更时同步更新。