gpt4 book ai didi

sql - 获取每组的前 1 行

转载 作者:行者123 更新时间:2023-12-03 03:55:05 25 4
gpt4 key购买 nike

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

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 也应该位于父表中吗?

请参阅父表以获取更多信息:

当前文档

| DocumentID | Title  | Content  | DateCreated |
| 1 | TitleA | ... | ... |
| 2 | TitleB | ... | ... |
| 3 | TitleC | ... | ... |

父表是否应该像这样以便我可以轻松访问其状态?

| DocumentID | Title  | Content  | DateCreated | CurrentStatus |
| 1 | TitleA | ... | ... | s1 |
| 2 | TitleB | ... | ... | s3 |
| 3 | TitleC | ... | ... | s1 |

更新我刚刚学会了如何使用“apply”,这可以更轻松地解决此类问题。

最佳答案

;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

至于标准化与否,就看你愿不愿意:

  • 在 2 个地方保持状态
  • 保留状态历史记录
  • ...

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

关于sql - 获取每组的前 1 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6841605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com