将 Dense_Rank Oracle 转换为 PostgresQL

Convert Dense_Rank Oracle to PostgresSQL

我有一个 select 语句,其中包含一个用 Oracle 编写的 dense_rank 函数,但我无法弄清楚如何使其与 postgressql 兼容 (v11.x)

SELECT facility_id_fk, max(inspection_date) as last_inspection,
               max(inspection_type) keep (dense_rank first order by inspection_date desc) as inspection_type
FROM facility_inspections
GROUP BY facility_id_fk

此查询提供了上次检查以及上次检查的类型:

-------------------------------------------------
facility id | inspection date | inspection type 
-------------------------------------------------
93              04/28/2020        FULL
94              04/28/2020        LIMITED
-------------------------------------------------

我已经尝试了以下但它遗漏了我需要的检查类型描述,并且仍然提供重复项并查看排名列,它看起来像是 table 中的所有检查而不是对于特定设施

SELECT facility_id_fk, max(inspection_date) as last_inspection,
      dense_rank () OVER (
           PARTITION BY inspection_type
           ORDER BY inspection_date DESC
           ) rank_order
FROM facility_inspections
GROUP BY facility_id_fk, inspection_date, inspection_type

在 Postgres 中,您可以使用方便的扩展程序 distinct on:

select distinct on (facility_id_fk) *
from facility_inspections
order by facility_id_fk, inspection_date desc

如果您要使用 window 函数执行此操作,这些函数比供应商特定语法(例如 Oracle 的 keep 或 Postgres 的 distinct on 更具可移植性,您可以对查询进行短语表达如:

select *
from (
    select f.*, row_number() over(partition by facility_id_fk order by inspection_date desc) rn
    from facility_inspections f
) f
where rn = 1