繁体   English   中英

第一个/最后一个与最小/最大 ORACLE。 SQL

[英]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中:

  • KEEP语句示例。

     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 
  • 没有KEEP语句的示例。

     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 FIRSTMIN()中的顺序位于同一列中,因此两者都在执行相同的操作,因此,我建议在此处不使用KEEP来处理性能问题。

Oracle 记录其行为

KEEP关键字用于语义清晰。 它限定了aggregate_function,表明仅将返回aggregate_function的FIRST或LAST值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM