提取记录,这些记录的值随时间变化

问题描述

我有一个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每个月只有一行值。