【问题标题】:Convert Dense_Rank Oracle to PostgresSQL将 Dense_Rank Oracle 转换为 PostgresQL
【发布时间】:2021-01-10 04:57:28
【问题描述】:

我有一个包含用 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

【问题讨论】:

    标签: oracle postgresql max greatest-n-per-group window-functions


    【解决方案1】:

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

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

    如果您要使用窗口函数来执行此操作,它比供应商特定语法(例如 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
    

    【讨论】:

    • 谢谢@GMB - 这几乎让我到了那里。我只需要考虑空值(我猜是 Oracle 自动完成的)并缩小返回的列数。非常感谢
    猜你喜欢
    • 2015-06-27
    • 2023-01-17
    • 2015-11-11
    • 2018-09-26
    • 2023-02-01
    • 2015-09-12
    • 2011-01-17
    • 2019-03-04
    相关资源
    最近更新 更多