将 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
我有一个 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