如何重构这个SQL查询?

时间:2012-12-10 20:51:30

标签: sql db2

我正在向IBM DB2服务器编写以下查询:

SELECT 
    EMPNO, 
    YEAR(CURRENT TIMESTAMP - BIRTHDATE) AS AGE,
    DENSE_RANK() OVER(ORDER BY YEAR(CURRENT TIMESTAMP - BIRTHDATE) ASC) AS RANK

FROM 
    DANDY.EMPLOYEE;

它有效,但看起来很难看,因为我正在重复表达:

YEAR(CURRENT TIMESTAMP - BIRTHDATE)

但如下写作不起作用:

DENSE_RANK() OVER(ORDER BY AGE ASC) AS RANK

如何让它变得更好?

3 个答案:

答案 0 :(得分:2)

SELECT 
EMPNO, 
AGE,
DENSE_RANK() OVER(ORDER BY AGE ASC) AS RANK
FROM (SELECT EMPNO,
             YEAR(CURRENT TIMESTAMP - BIRTHDATE) AS AGE
      FROM DANDY.EMPLOYEE);

答案 1 :(得分:0)

我知道标准ORDER BY子句通常接受列索引,但不确定它是否适用于DENSE_RANK() - 也许可以尝试:

DENSE_RANK() OVER(ORDER BY 2 ASC) AS RANK

答案 2 :(得分:0)

您可以使用公用表表达式(CTE)获取AGE,然后根据需要再次使用AGE

WITH
   CTEAGE AS
      (SELECT 
          YEAR(CURRENT TIMESTAMP - BIRTHDATE) AS AGE,
      FROM 
          DANDY.EMPLOYEE
      )

   SELECT 
      EMPNO, 
      CTEAGE.AGE,
      DENSE_RANK() OVER(CTEAGE.AGE ASC) AS RANK
   FROM 
      DANDY.EMPLOYEE;
相关问题