Sql 根据group by中的条件获取id

Sql 根据group by中的条件获取id,sql,greatest-n-per-group,Sql,Greatest N Per Group,我试图创建一个sql查询来合并日期相等的行。这样做的想法是基于最高的小时数,这样我最终会得到每个时间数最高的日期对应的id。我一直在尝试使用一个简单的groupby,但似乎不起作用,因为我不能只在id列上放置聚合函数,因为它应该基于小时数条件 +------+-------+--------------------------------------+ | id | date | hours | +------+-------+

我试图创建一个sql查询来合并日期相等的行。这样做的想法是基于最高的小时数,这样我最终会得到每个时间数最高的日期对应的id。我一直在尝试使用一个简单的groupby,但似乎不起作用,因为我不能只在
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                          |
+------+-------+--------------------------------------+

这里有一种使用
行数的方法

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

如果您只需要一行,即使有联系,也可以使用
row\u number()

具有讽刺意味的是,PrgReS和Oracle(原始标签)都有我认为更好的方法,但是它们有很大的不同。 博士后:

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;
您可以将子查询与关联方法结合使用:

select t.*
from table t
where id = (select t1.id
            from table t1
            where t1.date = t.date
            order by t1.hours desc
            limit 1);

在Oracle中,您可以在
子查询中使用
仅获取前1行
,而不是
限制
子句

我删除了不兼容的数据库标记。请仅使用您真正使用的数据库进行标记。我添加了最大的每组n个标记。这个问题已经以不同的形式被问了数百次,并且有很多解决方案。有些取决于您使用的RDBMS的特定品牌。