1

我有一个包含用 Oracle 编写的 dense_rank 函数的 select 语句,但我无法弄清楚如何使其与 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
-------------------------------------------------

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

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
4

1 回答 1

0

在 Postgres 中,您可以使用方便的扩展来做到这一点distinct on

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

如果您要使用窗口函数来执行此操作,它比供应商特定语法(如 Oraclekeep或 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
于 2020-09-23T22:59:40.473 回答