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