构造Oracle SQL查询

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

给出如下数据表:

+-----+-------------+--------+
| 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,但是我很难理解它们是如何工作的,如果它们是我需要的东西,那么我实际上并没有得到任何结果。

任何帮助将不胜感激!

sql oracle greatest-n-per-group
2个回答
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;

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