【问题标题】:Fetch records who see a change in value over time获取看到价值随时间变化的记录
【发布时间】:2021-02-06 21:00:37
【问题描述】:

我有一个包含 ID 级别每月记录的 SQL 表。我有兴趣仅隔离 VALUE 在最早的月份(7 月)和最晚的月份(9 月)之间发生变化的 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。谢谢!

【问题讨论】:

    标签: sql oracle datetime max min


    【解决方案1】:

    如果您想要改变,那么您正在寻找不同的值。所以:

    select id_field
    from t
    group by id_field
    having min(value) <> max(value);
    

    【讨论】:

      【解决方案2】:

      如果您关心任何更改,Gordon 已经给了您一个正确的答案,但我对您的问题的解释有所不同 - 如果 id_field 值在最早月份的值与最近月份的值不同,则您只关心 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, 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)
      group by id_field 
      having count(distinct value) > 1
      

      或者您可以使用集合运算符,例如:

      with sorted_table as 
       (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
       )
      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 值只有一行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-27
        相关资源
        最近更新 更多