Oracle SQL - 按值返回第一次出现的行

时间:2014-07-08 15:13:58

标签: sql oracle window-functions

我的数据格式如下:

ID     YRMTH       EVENT
1      201201        0
1      201202        0
1      201203        1
1      201204        0
1      201205        0
2      201304        0
2      201305        0
2      201306        0
3      201301        0
3      201302        0
3      201303        0
3      201304        1
3      201305        0

我想使用YRMTH和EVENT为每个ID返回一行。如果EVENT发生(= 1),那么当事件发生时我想要YRMTH并且EVENT = 1.如果没有发生EVENT(= 0),那么我想返回YRMTH和EVENT = 0中列出的最后一个月。

在这个例子中,我想要以下输出:

ID     YRMTH       EVENT
1      201203        1
2      201306        0
3      201304        1    

本质上,此查询的目的是识别事件发生的第一个月(如果发生了一个事件)。如果没有发生任何事件,那么我只想要上个月我们有数据。

我在想我需要使用窗口函数(PARTITION BY),但我对任何可能的解决方案持开放态度。

2 个答案:

答案 0 :(得分:2)

您可以使用聚合执行此操作。不需要分析功能:

select id,
       (case when max(event) = 1 then min(case when event = 1 then yrmth end)
             else max(yrmth)
        end) as yrmth,
       max(event) as event          
from table t
group by id;

答案 1 :(得分:0)

试试这个:

with cte as
(select id,
 case event
 when 1 then yrmth
 else max(yrmth) over (partition by id order by yrmth) 
 end as yrmth,
 event,
 row_number() over 
 (partition by id
  order by case event when 1 then 1 else 0 end desc, yrmth desc) as rn
from your_table)

select id, yrmth, event 
from cte
where rn = 1

SQLFiddle