Linha de qualificação teradata

Abaixo está o oracle SQL e eu quero mudá-lo no formato Teradata.

SELECT branch_code,
    branch_no,
    c_no,
    cd_type
FROM (
    SELECT branch_code,
        branch_no,
        c_no,
        cd_type,
        * * RANK() OVER (
            PARTITION BY c_no ORDER BY cd_type
            ) RANK * *
    FROM (
        SELECT branch_code,
            branch_no,
            c_no,
            MIN(cd_type) cd_type
        FROM EMPLOYEE
        WHERE S_CODE = 'C'
            AND (branch_no) NOT IN (
                SELECT branch_code
                FROM DEPARTMENT
                WHERE branch_code = 'ABC'
                )
        )
    )
WHERE RANK = 1

já me QUALIFICEI para o posto abaixo .

SELECT branch_code,
    branch_no,
    c_no,
    cd_type
FROM (
    SELECT branch_code,
        branch_no,
        c_no,
        cd_type,
        * * QUALIFY ROW_NUMBER() OVER (
            PARTITION BY c_no ORDER BY cd_type
            ) * * RANK
    FROM (
        SELECT branch_code,
            branch_no,
            c_no,
            MIN(cd_type) cd_type
        FROM EMPLOYEE
        WHERE S_CODE = 'C'
            AND (branch_no) NOT IN (
                SELECT branch_code
                FROM DEPARTMENT
                WHERE branch_code = 'ABC'
                )
        )
    )
WHERE RANK = 1
Mas obter um erro que " esperava algo entre , e qualificar.

Podemos colocar QUALIFY em instrução selecionada ?

Author: Radu Gheorghiu, 2013-12-16

2 answers

Você provavelmente simplificou a sua consulta existente, uma vez que esta não é uma SQL Oracle válida (não há nenhum grupo por na vista em linha). Além disso, você compara branch_no a branch_codeNO Não IN.

Caso contrário, a resposta de Ed Gibbs pode ser simplificada para:
SELECT branch_code,
    branch_no,
    c_no,
    MIN(cd_type) cd_type
FROM EMPLOYEE
WHERE S_CODE = 'C'
    AND (branch_no) NOT IN (
        SELECT branch_no
        FROM DEPARTMENT
        WHERE branch_code = 'ABC'
        )
GROUP BY branch_code,
    branch_no,
    c_no
QUALIFY
   RANK()
   OVER (PARTITION BY c_no 
         ORDER BY MIN(cd_type) = 1

Se branch_no for definido como Invulável, deve também reescrever NOT IN para NOT EXISTS

 2
Author: dnoeth, 2013-12-16 14:55:56

Normalmente, os valores analíticos como RANK são calculados de segundo para último, após a junção e filtragem e GROUP BY e HAVING. A única coisa feita após os valores analíticos é ORDER BY. É por isso que em Oracle você precisa colocar o RANK em uma consulta interna e, em seguida, testar o seu valor em uma consulta externa. Na Teradata, QUALIFY é executado após as funções analíticas e antes do ORDER BY, o que significa que não é necessária a consulta externa para testar o valor RANK.

Hoje Não tenho acesso à Teradata, por isso ... a consulta não foi testada, mas gosto de pensar que está perto.
SELECT branch_code,
    branch_no,
    c_no,
    cd_type
FROM (
    SELECT branch_code,
        branch_no,
        c_no,
        MIN(cd_type) cd_type
    FROM EMPLOYEE
    WHERE S_CODE = 'C'
        AND (branch_no) NOT IN (
            SELECT branch_code
            FROM DEPARTMENT
            WHERE branch_code = 'ABC'
        )
)
QUALIFY ROW_NUMBER() OVER (PARTITION BY c_no ORDER BY cd_type) = 1
 2
Author: Ed Gibbs, 2013-12-16 14:17:48