首页 > 解决方案 > 根据 group by 条件获取 id

问题描述

我正在尝试创建一个 sql 查询来合并日期相同的行。这个想法是根据最高小时数来执行此操作,以便我最终获得每个小时数最高的日期的相应 ID。我一直在尝试使用简单的 group by,但似乎不起作用,因为我不能只在id列上放置一个聚合函数,因为它应该基于小时条件

+------+-------+--------------------------------------+
| id   | date           | hours                       |
+------+-------+--------------------------------------+
| 1    | 2012-01-01     | 37                          |
| 2    | 2012-01-01     | 10                          |
| 3    | 2012-01-01     | 5                           |
| 4    | 2012-01-02     | 37                          |
+------+-------+--------------------------------------+

期望的结果

+------+-------+--------------------------------------+
| id   | date           | hours                       |
+------+-------+--------------------------------------+
| 1    | 2012-01-01     | 37                          |
| 4    | 2012-01-02     | 37                          |
+------+-------+--------------------------------------+

标签: sqlgreatest-n-per-group

解决方案


如果您只想要一排 - 即使有领带 - 然后使用row_number()

select t.*
from (select t.*, row_number() over (partition by date order by hours desc) as seqnum
      from t
     ) t
where seqnum = 1;

具有讽刺意味的是,Postgres 和 Oracle(原始标签)都有我认为更好的方法,但它们完全不同。

Postgres:

select distinct on (date) t.*
from t
order by date, hours desc;

甲骨文:

select date, max(hours) as hours,
       max(id) keep (dense_rank first over order by hours desc) as id
from t
group by date;

推荐阅读