Sql 关于多重分组的问题。如何从组中获取一行?
这是一个包含我的数据的表:Sql 关于多重分组的问题。如何从组中获取一行?,sql,sql-server,sql-server-2008,sql-server-2012,greatest-n-per-group,Sql,Sql Server,Sql Server 2008,Sql Server 2012,Greatest N Per Group,这是一个包含我的数据的表: ----------------------------- | 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
-----------------------------
| 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 |
-----------------------------
我需要在每个日期中找到最大值,并将其与相应的id一起输出。
例如:
现在我知道了如何在每个日期中输出最大值,但没有相应的id。
例如:
我使用的软件是MS SQL Server 2012。 我的代码:
SELECT
date,
MIN(value)
FROM
my_table
GROUP BY date
我尝试了SQL Server函数“第一个值”,但没有任何帮助
我还试图在子查询中创建比较条件,但在子查询内外指定变量(别名)时遇到了一些问题
有什么想法吗?您可以使用子查询进行筛选:
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
如果你想打破僵局,你可以使用
行数()
而不是秩()
——但是为了得到稳定的结果,你需要在order by
子句中增加第二列。在CTE中将行数()计算为rn
,然后过滤rn=1
@dnoeth,谢谢我做到了:)谢谢你的回答!我两种方法都试过,但结果都很奇怪。我的桌子没有被过滤掉。在值字段中,我只有一个常量用于所有记录。您名为“value”的字段的数据类型是什么?
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