从数据集中选择所有正数最小的数字[重复]

问题描述 投票:1回答:3

我在表格中有以下数据

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查询来选择所需的输出

sql oracle greatest-n-per-group
3个回答
0
投票

你可以使用rank()功能

select ID, Amount, Days from
(
 select rank() over (partition by ID order by days) as rn,
        t.*
   from tab t
)
where rn = 1;

Demo


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)和大表的索引,上述方法之一在实践中可能更快。


0
投票

首先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
© www.soinside.com 2019 - 2024. All rights reserved.