如何在 MS SQL 中将 last_value 与 group by 结合使用?
Posted
技术标签:
【中文标题】如何在 MS SQL 中将 last_value 与 group by 结合使用?【英文标题】:How to use last_value with group by with count in MS SQL? 【发布时间】:2021-05-07 17:00:56 【问题描述】:我有这样的表:
name | timeStamp | previousValue | newValue
Mark | 13.12.2020 | 123 | 155
Mark | 12.12.2020 | 123 | 12
Tom | 14.12.2020 | 123 | 534
Mark | 12.12.2020 | 123 | 31
Tom | 11.12.2020 | 123 | 84
Mark | 19.12.2020 | 123 | 33
Mark | 17.12.2020 | 123 | 96
John | 22.12.2020 | 123 | 69
John | 19.12.2020 | 123 | 33
我想混合使用 last_value、count (*) 和 group 来得到这个结果:
name | count | lastValue
Mark | 5 | 33
Tom | 2 | 534
John | 2 | 69
这部分:
select name, count(*) from table group by name
返回表:
name | count
Mark | 5
Tom | 2
John | 2
..但我必须为每个名称添加最后一个值。
怎么做? 最好的问候!
【问题讨论】:
【参考方案1】:LAST_VALUE
是一个窗口函数,因此您需要先获取该值,然后再聚合:
WITH CTE AS(
SELECT [name],
[timeStamp], --This is a poor choice for a column's name. timestamp is a (deprecated) synonym of rowversion, and a rowversion is not a date and time value
previousValue,
newValue,
LAST_VALUE(newValue) OVER (PARTITION BY [name] ORDER BY [timeStamp] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS lastValue
FROM dbo.YourTable)
SELECT [Name],
COUNT(*) AS [count],
lastValue
FROM CTE
GROUP BY [Name],
lastValue;
【讨论】:
我认为ROW_NUMBER = 1
而不是 GROUP BY
会更高效
那不会在外部查询中为整个组返回 COUNT
@Charlieface 。除非您的意思是在 CTE 中使用窗口化的 COUNT
。
是的,我显然做到了
谢谢你们!【参考方案2】:
我有一个可行的解决方案,但这里有另一个:
SELECT
[name], COUNT([name]), [lastValue]
FROM (
SELECT
[name], FIRST_VALUE([newValue]) OVER (PARTITION BY [name] ORDER BY TimeStamp DESC ROWS UNBOUNDED PRECEDING) AS [lastValue]
FROM [table]
) xyz GROUP BY [name], [lastValue]
保持健康!
【讨论】:
以上是关于如何在 MS SQL 中将 last_value 与 group by 结合使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Debezium从MS SQL中将250张表导入Kafka
当用户在 MS Access 中修改表中的另一列时,如何在 SQL Server 中将列设置为今天的日期 [关闭]
GROUP BY 中的 SQL Server 2014 LAST_VALUE