我有一张表格,我想获取每个组的最新条目。这是桌子:
DocumentStatusLogs 桌子
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
DateCreated
我的首选输出:
| DocumentID | Status | DateCreated | | 1 | S1 | 8/02/2011 | | 2 | S3 | 8/01/2011 | | 3 | S1 | 8/02/2011 |
是否有任何汇总函数只能从每个组中获得最高排名?请参阅GetOnlyTheTop下面的伪代码:
GetOnlyTheTop
SELECT
DocumentID, GetOnlyTheTop(Status), GetOnlyTheTop(DateCreated) FROM DocumentStatusLogs GROUP BY DocumentID ORDER BY DateCreated DESC
如果不存在这样的功能,有什么办法可以实现所需的输出?
或者首先,这可能是由于数据库未规范化引起的吗?我在想,因为我要查找的只是一行,所以该行status也应该位于父表中吗?
status
请参阅父表以获取更多信息:
当前Documents表
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 我刚刚学习了如何使用“应用”,这使得解决此类问题变得更加容易。
;WITH cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY DocumentID ORDER BY DateCreated DESC) AS rn FROM DocumentStatusLogs ) SELECT * FROM cte WHERE rn = 1
如果您希望每天输入2个条目,则可以任意选择一个条目。要获得一天的两个条目,请改用DENSE_RANK
至于是否标准化,取决于您是否要:
就目前而言,您将保留状态历史记录。如果您也想要父表中的最新状态(这是非规范化),则需要触发器来维护父表中的“状态”。或删除此状态历史记录表。