如何将Oracle的DENSE_RANK FIRST KEEP查询转换为Postgres等效写法
Oracle DENSE_RANK FIRST 语法转PostgreSQL等效写法
原Oracle语句逻辑
语句作用为:对目标表数据按prop2字段降序排序,取排序优先级最高(即prop2值最大)的所有行,在这批行中计算最大id值,返回结果别名为prop1。
原Oracle代码如下:
SELECT MAX(id) KEEP (DENSE_RANK FIRST ORDER BY prop2 DESC) AS prop1 FROM table t;
PostgreSQL等效写法
写法1:窗口函数实现(完全等效,适配所有版本)
SELECT MAX(id) AS prop1 FROM ( SELECT id, DENSE_RANK() OVER (ORDER BY prop2 DESC) AS rnk FROM "table" t ) t WHERE rnk = 1;
写法2:简化写法(PostgreSQL 13及以上版本支持,执行效率更高)
SELECT MAX(id) AS prop1 FROM ( SELECT id FROM "table" t ORDER BY prop2 DESC FETCH FIRST 1 ROWS WITH TIES ) t;
注意事项
上述SQL中的"table"为示例表名,因table是SQL关键字,实际使用时请替换为你的业务表名,若表名本身不是关键字可省略双引号。
内容的提问来源于stack exchange,提问作者yed2393
相关产品推荐
相关产品推荐

