【问题标题】:How can I get the TOP 1 from this GROUP BY result?我怎样才能从这个 GROUP BY 结果中获得 TOP 1?
【发布时间】:2015-02-11 01:39:45
【问题描述】:

我正在尝试在我的结果集中获得每个分组行的 TOP 1 结果。

Id LogType CreatedOn
===============================
1  Red     2000-01-02T12:34:56Z
2  Red     2000-01-02T12:34:56Z
3  Blue    2000-01-02T12:34:56Z
4  Green   2000-01-02T12:35:56Z
5  Red     2000-01-02T12:36:56Z
6  Red     2000-01-02T12:37:56Z
7  Blue    2000-01-02T12:38:56Z
8  Green   2000-01-02T12:39:56Z

预期结果

LogType Count MostRecent
==================================
Red     4     2000-01-02T12:37:56Z
Blue    2     2000-01-02T12:38:56Z
Green   2     2000-01-02T12:39:56Z

This has all been setup in this Sql Fiddle

我有COUNT(这很容易),但我不确定如何获取最新的,然后将其链接回之前的结果。我在想一个ROW_NUMBER() / PARTITION ORDER BY CreatedOn DESC 并按= 1 过滤..但我被卡住了。

注意:如果对软件特定关键字有任何疑问,我使用的是 SQL Server 2012。

【问题讨论】:

    标签: sql group-by sql-server-2012


    【解决方案1】:

    使用Count() over(Partition by) 技巧来做到这一点。

    Over 子句将帮助您找到每个 group(LogType) 的计数,然后正如您提到的,使用 row_number 窗口函数找到每个组中的前 1 个。

    select LogType, Count, MostRecent from 
    (
    select Row_number() over(partition by LogType order by CreatedOn DESC) RN,
           Id, LogType, CreatedOn as MostRecent,
           count(LogType) over(partition by LogType) [Count] 
           from yourtable
    ) A
    where RN=1
    

    SQLFIDDLE DEMO

    【讨论】:

    • TIL:你可以做一个COUNT(..) OVER(PARTITION ...)。我总是刚刚完成ROW_NUMBER() OVER..。 :hi-5:
    【解决方案2】:

    试试下面的代码:

    select LogType, count(1) as 'Count', max(CreatedOn) as 'MostRecent' 
    from yourtablename 
    group by LogType
    order by Count desc 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多