给出如下的数据表:
+-----+-------------+--------+
| 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,但是我很难理解它们是如何工作的,如果它们是我需要的,那么结果我并没有真正得到任何结果。
非常感谢任何帮助!
答案 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