小编典典

获取每个组的前1行

sql

我有一张表格,我想获取每个组的最新条目。这是桌子:

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 我刚刚学习了如何使用“应用”,这使得解决此类问题变得更加容易。


阅读 166

收藏
2021-05-05

共1个答案

小编典典

;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

至于是否标准化,取决于您是否要:

  • 维持两个地方的地位
  • 保留状态记录

就目前而言,您将保留状态历史记录。如果您也想要父表中的最新状态(这是非规范化),则需要触发器来维护父表中的“状态”。或删除此状态历史记录表。

2021-05-05