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

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 子句中添加第二列。