如何在 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

SQL Server ->> FIRST_VALUE和LAST_VALUE函数

在 MS SQL Server 中将字符串转换为日期时间

SQL查询获取分区里最大和最小值_first_value/last_value