关于多个分组的问题。如何从组中获取单行?
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 字段中,我只有一个用于所有记录的常量 您的名为“值”的字段的数据类型是什么?以上是关于关于多个分组的问题。如何从组中获取单行?的主要内容,如果未能解决你的问题,请参考以下文章