我遇到了两个似乎具有相同结果的查询:在分区上应用聚合函数。
我想知道这两个查询之间是否有任何区别:
SELECT empno,
deptno,
sal,
MIN(sal) OVER (PARTITION BY deptno) "Lowest",
MAX(sal) OVER (PARTITION BY deptno) "Highest"
FROM empl
SELECT empno,
deptno,
sal,
MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest",
MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest"
FROM empl
第一个版本更合乎逻辑,但第二个版本可能是某种特殊情况,也许是一些性能优化。
原文由 aurelije 发布,翻译遵循 CC BY-SA 4.0 许可协议
在您的示例中,没有区别,因为您的聚合位于您正在排序的同一列上。 “KEEP”的真正意义/力量在于您在 不同的 列上进行聚合和排序。例如(从另一个答案中借用“测试”表)……
;
此查询获取每个部门中薪水最高的人的姓名。考虑没有“KEEP”子句的替代方案:
KEEP 子句更简单、更高效(在这个简单的示例中,只有 3 个一致的获取与 34 个获取替代)。