给定如下数据表:
一个 | b | 丙 | d | 埃 |
---|---|---|---|---|
1 | 测试 | 9 | 时长 | 2024-10-22 08:00:00.000 |
1 | 测试 | 9 | 升 | 2024-10-23 08:00:00.000 |
1 | 测试 | 9 | 问 | 2024-10-22 08:00:00.000 |
我想按 a、b、c 列对数据进行分组,并显示 d 列中具有最新日期的值(e 列)。
因此,我希望得到一行这样的数据:
一个 | b | 丙 | d |
---|---|---|---|
1 | 测试 | 9 | 升 |
我本来希望有像下面这样简单的东西,例如“last()”,但据我所知,没有这么简单的东西?
SELECT
a, b, c,
last(d)
FROM
dbo.items
GROUP BY
a, b, c
我能找到的唯一接近我想要的例子是LAST_VALUE OVER PARTITION
它在 group by 中不起作用
LAST_VALUE(d) OVER (PARTITION BY d ORDER BY e) AS d
我知道类似的事情也可以访问不在分组依据中的内容,比如如果 b 想要在分组依据中,我仍然可以访问STRING_AGG
所有的值,像这样
STRING_AGG(b, ',') AS b
并得到“test,test,test”作为值
如果您使用 SQL Server,则使用 Row_Number 可能会有效
小提琴
有一些比较简单的解决方案,也有一些比较标准的解决方案。
标准是获取子查询中的最后一个值,然后对其进行聚合,例如:
这种黑客方法我称之为重构,它需要组合你的聚合值,然后在检索最大值后将其解构回来,如下所示:
在这里,通过结合日期和
d
值的 varchar 表示,可以按日期获得自然上升的值,因此可以使用 MAX。获得最高值后,可以使用 STUFF 函数删除日期部分并获取值d
。这有一些注意事项,特别是如果您连接非字符串列。此外,如果您有多个相同的日期,则无法使用决胜局。好处是它避免了额外的窗口聚合步骤。