从数据集中选择所有最小的正数

时间:2019-04-13 21:20:52

标签: sql oracle greatest-n-per-group

我在表格中有以下数据

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

3 个答案:

答案 0 :(得分:1)

对于您的示例,您可以简单地执行以下操作:

stat = os.stat(path)

stat_dict = lambda path: {name: getattr(stat, field)  for field in dir(stat) if field.startswith("st_")}

如果stat_dict = lambda path: {name: getattr(stat, field) for field in dir(stat:=os.stat(path)) if field.startswith("st_")} 不固定,则相关子查询是一种方法:

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

答案 1 :(得分: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

答案 2 :(得分: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