代码之家  ›  专栏  ›  技术社区  ›  Coding Duchess

带条件过滤器的Oracle查询

  •  0
  • Coding Duchess  · 技术社区  · 4 年前

    我有一张桌子有两张。每个标题只有一条记录被标记为活动记录,有时,所有记录都被标记为非活动记录。因此,如果所有记录都处于非活动状态,我需要选择上次更新的记录,如果一个记录处于活动状态,我需要选择活动的记录,而不管最新的日期是什么。

    在一个简单的查询中可以这样做吗?

    比如我有

    Record_ID  Title    Status      Activity_Date
    111       TEST1     Active      10/11/2020
    112       TEST1     Inactive    10/11/2020
    113       TEST2     Inactive    9/26/2021
    114       TEST2     Inactive    4/14/2021
    

    理想的结果是

    Record_ID  Title    Status      Activity_Date
    111       TEST1     Active      10/11/2020
    113       TEST2     Inactive    9/26/2021
    

    我曾经

    SELECT * FROM TITLES t WHERE t.RECORD_ID > 100
    AND t.ACTIVITY_DATE = (SELECT MAX(ACTIVITY_DATE) FROM TITLES WHERE 
    RECORD_ID = t.RECORD_ID)
    

    但只考虑最新日期部分并返回以下内容:

    Record_ID  Title    Status      Activity_Date
    111       TEST1     Active      10/11/2020
    112       TEST1     Inactive    10/11/2020
    113       TEST2     Inactive    9/26/2021
    

    是否可以将其设置为有条件的?如果最新日期返回dups,请使用status?

    0 回复  |  直到 4 年前
        1
  •  0
  •   Littlefoot    4 年前

    我建议这样做;阅读代码中的注释

    SQL> with test (record_id, title, status, activity_date) as
      2    -- sample data
      3    (select 111, 'test1', 'active'  , date '2020-10-11' from dual union all
      4     select 112, 'test1', 'inactive', date '2020-10-11' from dual union all
      5     select 113, 'test2', 'inactive', date '2021-09-26' from dual union all
      6     select 114, 'test2', 'inactive', date '2021-04-14' from dual
      7    ),
      8  temp as
      9    -- rank them - first by status, then by date in descending order
     10    (select t.*,
     11       rank() over (partition by title order by status, activity_date desc) rnk
     12     from test t
     13    )
     14  -- finally, return rows that rank the "highest"
     15  select m.record_id, m.title, m.status, m.activity_date
     16  from temp m
     17  where m.rnk = 1;
    
     RECORD_ID TITLE STATUS   ACTIVITY_D
    ---------- ----- -------- ----------
           111 test1 active   10/11/2020
           113 test2 inactive 09/26/2021
    
    SQL>