【问题标题】:Issue about multiple grouping. How to get a single row from a group?关于多个分组的问题。如何从组中获取单行?
【发布时间】:2026-02-07 05:10:02
【问题描述】:

这是我的数据表:

-----------------------------
|   date   |  value  |  id  |
|03/05/18  |5        | 1    |
|03/05/18  |3        | 2    |
|03/05/18  |5        | 3    |
|03/05/18  |6        | 4    |
|03/05/18  |9        | 5    |
|08/03/19  |5        | 6    |
|08/03/19  |3        | 7    |
|08/03/19  |1        | 8    |
|08/03/19  |6        | 9    |
|01/06/20  |7        | 10   |
|01/06/20  |0        | 11   |
|01/06/20  |2        | 12   |
-----------------------------

我需要在每个date中找到最大的value,并输出对应的id。 示例:

-----------------------------
|   date   |  value  |  id  |
|03/05/18  |9        | 5    |
|08/03/19  |6        | 9    |
|01/06/20  |7        | 10   |
-----------------------------

现在我知道如何在每个 date 中输出最大 value,但 没有 对应的 id。 示例:

----------------------
|   date   |  value  |
|03/05/18  |9        |
|08/03/19  |6        |
|01/06/20  |7        |
----------------------

我使用的软件是 MS SQL Server 2012。

我的代码:

    SELECT 
    date,
    MIN(value)
    
    FROM 
    my_table
    
    GROUP BY date

我尝试了 SQL Server 函数“FIRST_VALUE”,但没有帮助。

我还尝试在子查询中创建比较条件,但在子查询内外指定变量(别名)时遇到了一些问题。

有什么想法吗?

【问题讨论】:

  • 在 CTE 中计算 row_number() over (partition by date order by value desc) as rn,然后过滤 rn = 1
  • @dnoeth,谢谢!我做到了:)

标签: sql sql-server sql-server-2008 sql-server-2012 greatest-n-per-group


【解决方案1】:

您可以使用子查询进行过滤:

select t.*
from mytable t
where t.value = (select max(t1.value) from mytable t1 where t1.date = t.date)

这将允许*关系,如果有的话。另一种选择是使用窗口函数:

select *
from (
    select t.*, rank() over(partition by date order by value desc) rn
    from mytable t
) t
where rn = 1

如果您想打破平局,您可以使用row_number() 而不是rank() - 但要获得稳定的结果,您需要在order by 子句中添加第二列。

【讨论】:

  • 感谢您的回答!我尝试了这两种方法,但得到了奇怪的结果。我的表没有被过滤掉。在 value 字段中,我只有一个用于所有记录的常量
  • 您的名为“值”的字段的数据类型是什么?
最近更新 更多