2

次のクエリを 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

それをより良くする方法は?

4

3 に答える 3

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);
于 2012-12-10T21:00:36.947 に答える
0

Common Table Expression (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;
于 2012-12-10T20:59:49.563 に答える
0

ORDER BY標準句は通常、列インデックスを受け入れることは知っていますが、それが機能するかどうかはわかりませんDENSE_RANK()-多分試してみてください:

DENSE_RANK() OVER(ORDER BY 2 ASC) AS RANK
于 2012-12-10T20:56:49.373 に答える