关于多个分组的问题。如何从组中获取单行?

Posted

技术标签:

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

这是我的数据表:

-----------------------------
|   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,谢谢!我做到了:) 【参考方案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 字段中,我只有一个用于所有记录的常量 您的名为“值”的字段的数据类型是什么?

以上是关于关于多个分组的问题。如何从组中获取单行?的主要内容,如果未能解决你的问题,请参考以下文章

应用 groupby 后从组中获取特定元素-PANDAS [重复]

SQL Server:根据多个条件从组中选择特定行

.NET 正则表达式分组:从组中排除字符串

按值(不是列)分组后从组中选择一个随机条目?

如果选择字段,则从组中获取所有选定的选项

如何组合两列以使第三列按方法从组中获取属性?