Reputation: 6696
I am writing the following query to IBM DB2 server:
SELECT
EMPNO,
YEAR(CURRENT TIMESTAMP - BIRTHDATE) AS AGE,
DENSE_RANK() OVER(ORDER BY YEAR(CURRENT TIMESTAMP - BIRTHDATE) ASC) AS RANK
FROM
DANDY.EMPLOYEE;
It works, but looks ugly, as I am repeating expression:
YEAR(CURRENT TIMESTAMP - BIRTHDATE)
But writing as follows doesn't works:
DENSE_RANK() OVER(ORDER BY AGE ASC) AS RANK
How to make it better?
Upvotes: 2
Views: 306
Reputation: 1234
SELECT
EMPNO,
AGE,
DENSE_RANK() OVER(ORDER BY AGE ASC) AS RANK
FROM (SELECT EMPNO,
YEAR(CURRENT TIMESTAMP - BIRTHDATE) AS AGE
FROM DANDY.EMPLOYEE);
Upvotes: 2
Reputation: 3558
You could use a Common Table Expression (CTE) to get AGE
, then use AGE
again as needed.
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;
Upvotes: 0
Reputation: 4914
I know standard ORDER BY
clauses usually accept the column index, though not sure if it will work with DENSE_RANK()
- maybe try:
DENSE_RANK() OVER(ORDER BY 2 ASC) AS RANK
Upvotes: 0