【问题标题】:How to use last_value with group by with count in MS SQL?如何在 MS SQL 中将 last_value 与 group by 结合使用?
【发布时间】: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   

..但我必须为每个名称添加最后一个值。

怎么做? 最好的问候!

【问题讨论】:

    标签: sql-server tsql group-by


    【解决方案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]
    

    保持健康!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2021-11-06
      • 2018-06-16
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多