这个问题在这里已有答案:
我在表格中有以下数据
ID AMOUNT DAYS
1 10 1
1 20 2
1 30 3
1 1 4
2 34 1
2 234 2
2 234 3
2 34 4
3 3 1
3 3 2
3 23 3
3 20 4
我希望以下结果为所有具有最少ID天数的金额
ID AMOUNT DAYS
1 10 1
2 34 1
3 3 1
请建议一个SQL查询来选择所需的输出
你可以使用rank()
功能
select ID, Amount, Days from
(
select rank() over (partition by ID order by days) as rn,
t.*
from tab t
)
where rn = 1;
对于您的示例,您可以简单地执行:
select t.*
from t
where t.days = 1;
如果没有修复1
,则相关子查询是一种方法:
select t.*
from t
where t.days = (select min(t2.days) from t t2 where t2.id = t.id);
另一种方法是聚合:
select t.id, min(t.days) as min_days,
min(t.amount) keep (dense_rank first order by t.days asc) as min_amount
from t
group by t.id;
当然row_number()
/ rank()
是另一种选择。
使用(id, days)
和大表的索引,上述方法之一在实践中可能更快。
首先group by id
找到每个id的最小日期,然后加入到表中
select t.*
from tablename t inner join (
select id, min(days) days
from tablename
group by id
) g on g.id = t.id and g.days = t.days