[英]first/ last vs min/max. ORACLE. SQL
这是查询和查询的结果:
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 emp
ORDER BY deptno, sal;
EMPNO DEPTNO SAL Lowest Highest
---------- ---------- ---------- ---------- ----------
7934 10 1300 1300 5000
7782 10 2450 1300 5000
7839 10 5000 1300 5000
7369 20 800 800 3000
7876 20 1100 800 3000
7566 20 2975 800 3000
7788 20 3000 800 3000
7902 20 3000 800 3000
7900 30 950 950 2850
7654 30 1250 950 2850
7521 30 1250 950 2850
7844 30 1500 950 2850
7499 30 1600 950 2850
7698 30 2850 950 2850
SQL>
如果没有 KEEP语句,它将返回相同的结果吗? 为什么或者为什么不?
PS我本来会检查它,但是在当前机器上没有数据库访问权限。
根据您的标签,我假设您在Oracle中:
EMPNO | DEPTNO | SAL | LOWEST | HIGHEST 7934 | 10 | 1300 | 1300 | 5000 7782 | 10 | 2450 | 1300 | 5000 7839 | 10 | 5000 | 1300 | 5000 7369 | 20 | 800 | 800 | 3000 7876 | 20 | 1100 | 800 | 3000 7566 | 20 | 2975 | 800 | 3000 7788 | 20 | 3000 | 800 | 3000 7902 | 20 | 3000 | 800 | 3000 7900 | 30 | 950 | 950 | 2850 7654 | 30 | 1250 | 950 | 2850 7521 | 30 | 1250 | 950 | 2850 7844 | 30 | 1500 | 950 | 2850 7499 | 30 | 1600 | 950 | 2850 7698 | 30 | 2850 | 950 | 2850
EMPNO | DEPTNO | SAL | LOWEST | HIGHEST 7934 | 10 | 1300 | 1300 | 5000 7782 | 10 | 2450 | 1300 | 5000 7839 | 10 | 5000 | 1300 | 5000 7369 | 20 | 800 | 800 | 3000 7876 | 20 | 1100 | 800 | 3000 7566 | 20 | 2975 | 800 | 3000 7788 | 20 | 3000 | 800 | 3000 7902 | 20 | 3000 | 800 | 3000 7900 | 30 | 950 | 950 | 2850 7654 | 30 | 1250 | 950 | 2850 7521 | 30 | 1250 | 950 | 2850 7844 | 30 | 1500 | 950 | 2850 7499 | 30 | 1600 | 950 | 2850 7698 | 30 | 2850 | 950 | 2850
如您所见(和测试),两者输出相同的结果。
MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal)
通过sal进行MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal)
意思是“按sal排序行,并仅选择sal值最小的行。如果您有更多具有相同sal的行,则开始时的min函数会告诉您甲骨文选择了薪水最低的那个。”
在这种情况下,由于DENSE_RANK FIRST
和MIN()
中的顺序位于同一列中,因此两者都在执行相同的操作,因此,我建议在此处不使用KEEP
来处理性能问题。
Oracle 记录其行为 。
KEEP关键字用于语义清晰。 它限定了aggregate_function,表明仅将返回aggregate_function的FIRST或LAST值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.