我正在向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
如何让它变得更好?
答案 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;