关于多分组的问题。如何从组中获取一行?
Issue about multiple grouping. How to get a single row from a group?
这是 table 我的数据:
-----------------------------
| 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 |
-----------------------------
现在我知道如何在每个日期输出最大值但是没有对应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 服务器功能“FIRST_VALUE”,但没有用。
我还尝试在子查询中创建比较条件,运行 解决了在子查询内外指定变量(别名)的一些问题。
有什么想法吗?
您可以使用子查询进行过滤:
select t.*
from mytable t
where t.value = (select max(t1.value) from mytable t1 where t1.date = t.date)
这将允许顶级关系(如果有的话)。另一种选择是使用 window 函数:
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
子句中添加第二列。
这是 table 我的数据:
-----------------------------
| 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 |
-----------------------------
现在我知道如何在每个日期输出最大值但是没有对应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 服务器功能“FIRST_VALUE”,但没有用。
我还尝试在子查询中创建比较条件,运行 解决了在子查询内外指定变量(别名)的一些问题。
有什么想法吗?
您可以使用子查询进行过滤:
select t.*
from mytable t
where t.value = (select max(t1.value) from mytable t1 where t1.date = t.date)
这将允许顶级关系(如果有的话)。另一种选择是使用 window 函数:
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
子句中添加第二列。