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

第一个/最后一个vs最小/最大ORACLE。SQL,sql,oracle,Sql,Oracle,以下是查询和查询结果: 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 B

以下是查询和查询结果:

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语句?为什么


另外,我本来会亲自检查,但在当前机器上没有数据库访问权限。

根据您的标记,我假设您在Oracle中:

正如您所见(和测试),两者都输出相同的结果

MIN(sal)KEEP(densite_RANK FIRST ORDER BY sal)
的意思是“按sal对行进行排序,只选择sal值最小的行。如果有更多行具有相同的sal,则开始时的MIN函数会告诉Oracle选择sal值最小的行。”


在这种情况下,由于
densite\u中的顺序排在第一位
MIN()
具有相同的列,因此我建议不要在此处使用
KEEP
,因为性能问题。

基于您的标记,我假设您在Oracle中:

正如您所见(和测试),两者都输出相同的结果

MIN(sal)KEEP(densite_RANK FIRST ORDER BY sal)
的意思是“按sal对行进行排序,只选择sal值最小的行。如果有更多行具有相同的sal,则开始时的MIN函数会告诉Oracle选择sal值最小的行。”

在这种情况下,由于
densite\u中的顺序排在第一位
MIN()
具有相同的列,因此我建议不要在性能问题上使用
KEEP

KEEP关键字是为了语义清晰。它符合条件 聚合函数,表示只有 将返回聚合函数

甲骨文

KEEP关键字是为了语义清晰。它符合条件 聚合函数,表示只有 将返回聚合函数


你可以自己测试一下。不是我不想回答,而是你似乎不知道这个工具。不过似乎对我不起作用:/你可以自己测试一下。不是我不想回答,而是你似乎不知道这个工具。但似乎对我不起作用:/谢谢Alejandro。这是我的猜测,但现在我确定了,谢谢亚历杭德罗。这是我的猜测,但现在我肯定知道xx了
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