Return 行具有 3 个或更多连续值作为 1,排序依据日期和分组按地区
Return rows that has 3 or more consecutive values as 1 with Order by on Date & Group By Region
我尝试了 Tabibitosan 方法但没有帮助。您能否针对以下情况提出一些其他解决方案。
使用 Oracle 11g:
请找到下面的table格式,
Region Date Value
East 1/1/2018 1
East 1/2/2018 1
East 1/3/2018 0
East 1/4/2018 1
East 1/5/2018 1
East 1/7/2018 1
West 1/9/2018 0
West 1/10/2018 0
West 2/3/2018 1
West 2/4/2018 1
East 2/5/2018 1
West 2/8/2018 0
West 2/9/2018 0
West 2/10/2018 0
根据以上 table 我应该 return 值 1 的行在日期(排序依据)和地区方面出现 3 次或更多次。
**My Output:**
Region Date Value
East 1/4/2018 1
East 1/5/2018 1
East 1/7/2018 1
注意:日期列中的日期可能不包含所有日期。比如说,在上面的 1/6/2018 中缺少这很好。当按 'Date' 排序时,我需要查找 'Value' 列,该列有 1 个连续的 3 行或更多行。
只需使用lead()
:
select t.*
from (select t.*,
lead(value) over (partition by region order by date) as value_1,
lead(value, 2) over (partition by region order by date) as value_2
from t
) t
where value = 1 and value_1 = 1 and value_2 = 1;
如果您连续有 4 个或更多并且只想要第一个,您可以添加 lag()
:
select t.*
from (select t.*,
lag(value) over (partition by region order by date) as prev_value,
lead(value) over (partition by region order by date) as value_1,
lead(value, 2) over (partition by region order by date) as value_2
from t
) t
where value = 1 and value_1 = 1 and value_2 = 1 and
(prev_value is null or prev_value <> 1);
如果您希望获取所有符合条件的行,请尝试以下操作。
with data
as (
select x.region,x.date1,x.value,x.pattern_start,x.rnk
from (
select region
,date1
,value
,row_number() over(order by region,date1) as rnk
,case when value=1
and lead(value,1) over(partition by region order by date1) = 1
and lead(value,2) over(partition by region order by date1) = 1
then row_number() over(order by region,date1)
end as pattern_start
,lead(value,2) over(partition by region order by date1) as next_val_2
,lead(value,3) over(partition by region order by date1) as next_val_3
from t)x
)
select *
from data y
where y.rnk in (select pattern_start from data union all
select pattern_start+1 from data union all
select pattern_start+2 from data
)
order by 1,2
演示Link
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=1aa6d5de2b0ec375f659d0243aba350a
我尝试了 Tabibitosan 方法但没有帮助。您能否针对以下情况提出一些其他解决方案。
使用 Oracle 11g:
请找到下面的table格式,
Region Date Value
East 1/1/2018 1
East 1/2/2018 1
East 1/3/2018 0
East 1/4/2018 1
East 1/5/2018 1
East 1/7/2018 1
West 1/9/2018 0
West 1/10/2018 0
West 2/3/2018 1
West 2/4/2018 1
East 2/5/2018 1
West 2/8/2018 0
West 2/9/2018 0
West 2/10/2018 0
根据以上 table 我应该 return 值 1 的行在日期(排序依据)和地区方面出现 3 次或更多次。
**My Output:**
Region Date Value
East 1/4/2018 1
East 1/5/2018 1
East 1/7/2018 1
注意:日期列中的日期可能不包含所有日期。比如说,在上面的 1/6/2018 中缺少这很好。当按 'Date' 排序时,我需要查找 'Value' 列,该列有 1 个连续的 3 行或更多行。
只需使用lead()
:
select t.*
from (select t.*,
lead(value) over (partition by region order by date) as value_1,
lead(value, 2) over (partition by region order by date) as value_2
from t
) t
where value = 1 and value_1 = 1 and value_2 = 1;
如果您连续有 4 个或更多并且只想要第一个,您可以添加 lag()
:
select t.*
from (select t.*,
lag(value) over (partition by region order by date) as prev_value,
lead(value) over (partition by region order by date) as value_1,
lead(value, 2) over (partition by region order by date) as value_2
from t
) t
where value = 1 and value_1 = 1 and value_2 = 1 and
(prev_value is null or prev_value <> 1);
如果您希望获取所有符合条件的行,请尝试以下操作。
with data
as (
select x.region,x.date1,x.value,x.pattern_start,x.rnk
from (
select region
,date1
,value
,row_number() over(order by region,date1) as rnk
,case when value=1
and lead(value,1) over(partition by region order by date1) = 1
and lead(value,2) over(partition by region order by date1) = 1
then row_number() over(order by region,date1)
end as pattern_start
,lead(value,2) over(partition by region order by date1) as next_val_2
,lead(value,3) over(partition by region order by date1) as next_val_3
from t)x
)
select *
from data y
where y.rnk in (select pattern_start from data union all
select pattern_start+1 from data union all
select pattern_start+2 from data
)
order by 1,2
演示Link https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=1aa6d5de2b0ec375f659d0243aba350a