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 ?
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_code
NO Não IN.
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
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
.
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