问题描述
我有一个sql表,其中包含ID级别的每月记录。我只想隔离值在最早的一个月(七月)到最近的一个月(九月)之间已更改的ID。
| ID_FIELD | MONTH | VALUE |
|:-----------|------------:|:------------:|
| ID1 | 01-JUL-20 | 3 |
| ID1 | 01-AUG-20 | 3 |
| ID1 | 01-SEP-20 | 3 |
| ID2 | 01-JUL-20 | 2 |
| ID2 | 01-AUG-20 | 2 |
| ID2 | 01-SEP-20 | 3 |
| ID3 | 01-JUL-20 | 1 |
| ID3 | 01-AUG-20 | 3 |
| ID3 | 01-SEP-20 | 3 |
看起来很简单-但不确定解决此问题的最简单方法。我正在使用Oracle sql Developer。谢谢!
解决方法
如果要更改,则需要其他值。所以:
select id_field
from t
group by id_field
having min(value) <> max(value);
,
如果您关心任何更改,Gordon都会为您提供正确的答案,但是我对您的问题的解释有所不同-您只关心id_field值,如果它们最早一个月的值与最近一个月的值不同,则忽略它们在这两个月之间的价值。
首先,您需要最早和最新的值:
select *
from (
select id_field,value,row_number() over (partition by id_field order by month) rn_asc,row_number() over (partition by id_field order by month desc) rn_desc
from my_table
)
where 1 in (rn_asc,rn_desc)
然后您可以申请一个满足条件
select id_field
from (
select id_field,rn_desc)
group by id_field
having count(distinct value) > 1
或者您可以使用类似以下的集合运算符:
with sorted_table as
(select id_field,row_number() over (partition by id_field order by month desc) rn_desc
from my_table
)
select distinct id_field
from (select id_field,value
from sorted_table
where rn_asc = 1
minus
select id_field,value
from sorted_table
where rn_desc = 1
)
两个选项均假设每个id_field每个月只有一行值。