咨询:MIN() KEEP(DENSE_RANK LAST)与DENSE_RANK() OVER是否等价
关于Oracle中KEEP(DENSE_RANK LAST)与DENSE_RANK() OVER写法的等价性疑问
我正在梳理一段旧SQL脚本,尚未完全掌握DENSE_RANK的用法。旧代码如下:
min(T.col1) KEEP(DENSE_RANK LAST ORDER BY T.col2) as rank
请问该写法是否与以下代码等价?
Dense_rank() OVER (PARTITION BY MIN(T.col1) order by T.col2 desc) as Rank
这两段代码完全不等价,核心差异如下:
功能本质不同
第一段是Oracle特有的KEEP聚合语法:先按T.col2排序取最后(即值最大)的排名组,再在该组内计算T.col1的最小值,最终返回一个单一聚合结果。
第二段是窗口函数DENSE_RANK():以MIN(T.col1)为分区键,在每个分区内按T.col2降序计算密集排名,返回的是每行对应的排名值,结果行数和原数据集一致。执行逻辑差异
KEEP(DENSE_RANK LAST)属于聚合操作,通常搭配GROUP BY使用,最终结果行数由分组规则决定。DENSE_RANK() OVER(...)是窗口计算,不会压缩结果集行数,且PARTITION BY MIN(T.col1)的写法存在逻辑问题——MIN(T.col1)是聚合函数,无法直接用于非聚合上下文的窗口分区(即便在聚合查询中使用,其行为也和第一段代码完全不同)。
内容的提问来源于stack exchange,提问作者Duke578
相关产品推荐
相关产品推荐

