0

这是查询和查询的结果:

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我会自己检查它,但在当前机器上没有数据库访问权限。

4

2 回答 2

3

根据您的标签,我假设您在 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对行进行排序,只选择那些sal值最小的行。如果你有更多行具有相同的sal,那么一开始的min函数会告诉Oracle选择sal值最小的行。 "

在这种情况下,由于 theDENSE_RANK FIRST和 theMIN()中的顺序在同一列中,因此两者都在做同样的事情,所以我建议不要KEEP在此处使用性能问题。

于 2013-07-04T21:54:29.920 回答
1

Oracle记录了它的行为

KEEP 关键字是为了语义清晰。它限定了aggregate_function,表示只返回aggregate_function 的FIRST 或LAST 值。

于 2013-07-04T22:38:51.900 回答