【问题标题】:Oracle query with conditional filters带有条件过滤器的 Oracle 查询
【发布时间】:2021-10-20 00:23:35
【问题描述】:

我有一个有重复的表。每个标题只有一个记录被标记为活动,有时,所有记录都被标记为非活动。因此,如果所有记录都处于非活动状态,我需要选择最后更新的记录,如果有一条处于活动状态,则无论最新日期如何,我都需要选择处于活动状态的记录。

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

例如我有

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,则使用状态?

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我会建议这样的事情;在代码中读取 cmets

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2020-10-20
      • 2020-12-31
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多