构造Oracle SQL查询

时间:2018-03-07 12:38:49

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

给出如下的数据表:

+-----+-------------+--------+
| id  | end         | status |
+-----+-------------+--------+
| a   | 07-FEB-2018 | 1      |
| a   | 08-FEB-2018 | 2      |
| a   | 08-FEB-2018 | 3      |
| b   | 06-MAR-2018 | 2      |
| b   | 08-SEP-2018 | 3      |
+-----+-------------+--------+

在Oracle SQL中,可以构造一个查询,该查询将为每个id返回最大结束日期的最小状态(可能有多个行具有相同的最大结束日期)。

所以在这个例子中,这将返回:

+-----+--------+
| id  | status |
+-----+--------+
| a   | 2      |
| b   | 3      |
+-----+--------+

我一直在关注FIRST_VALUE和PARTITION BY,但是我很难理解它们是如何工作的,如果它们是我需要的,那么结果我并没有真正得到任何结果。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

一种方法使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by id order by end desc, status asc) as seqnum
      from t
     ) t
where seqnum = 1;

您也可以使用聚合函数执行此操作:

select id,
       min(status) keep (dense_rank first order by date desc, status asc) as status
from t
group by id;

答案 1 :(得分:0)

您可以使用内部联接或最大结束

select m.id, min(m.status)
from my_table m
inner join ( 
select id, max(end) max_end
from my_table  
group by id ) t.max_end = m.end   and t.id = m.id 
group by m.id