【问题标题】:Ranking over several columns对多列进行排名
【发布时间】:2015-01-17 11:17:47
【问题描述】:

在查询优化过程中,我得到了以下 SQL 查询:

select s.*
from
(
select id, DATA, update_dt, inspection_dt, check_dt
RANK OVER() 
(PARTITION by ID
 ORDER BY update_dt DESC, DATA) rank
 FROM TABLE 
where update_dt < inspection_dt or update_dt < check_dt 
) r
where r.rank = 1

查询返回对应于最新 check_dt 的 DATA。 但是,我想要得到的是: 1.最新check_dt对应的DATA 2.最新inspection_dt对应的DATA。

其中一个简单的解决方案 - 只需编写两个带有 where 单一条件的单独查询 - 一个用于inspection_dt,一个用于 check_dt。然而,这样就失去了最初的意图——缩短运行时间。

通过观察源数据,我注意到了实现它的方式——检查日期总是晚于检查日期;知道我可以提取等级 = 1 的记录,它会给我对应于最新 CHECK_DT 的 DATA,而具有最大等级的记录将对应于 INSPECTION。 但是,数据恐怕数据不会总是一致的,所以我一直在寻找更抽象的解决方案。

【问题讨论】:

    标签: sql optimization partition


    【解决方案1】:

    这个怎么样?

    select s.*
    from (select id, DATA, update_dt, inspection_dt, check_dt,
                 RANK() OVER (PARTITION by ID
                              ORDER BY update_dt DESC, DATA
                             ) as rank_upd,
                 RANK() OVER (PARTITION by ID
                              ORDER BY inspection_dt DESC, DATA
                             ) as rank_insp,
    
         FROM TABLE 
        ) r
    where r.rank_upd = 1 or r.rank_insp = 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 2015-11-07
      • 2019-02-04
      相关资源
      最近更新 更多