我的数据格式如下:
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
),但我对任何可能的解决方案持开放态度。
答案 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