[英]QUALIFY ROW_NUMBER in teradata
下面是oracle SQL,我想將其更改為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
我已經將QUALIFY用於RANK,如下所示。
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
但是卻收到錯誤消息“期望在和合格之間。
我們可以在選擇語句中放入QUALIFY嗎?
通常,在加入和過濾以及GROUP BY
和HAVING
之后,倒數第二個計算值,例如RANK
。 解析值之后唯一要做的就是ORDER BY
。 這就是為什么在Oracle中,您需要將RANK
放入內部查詢中,然后在外部查詢中測試其值。 在Teradata中, QUALIFY
在分析函數之后和ORDER BY
之前執行,這意味着您不需要外部查詢即可測試RANK
值。
我今天沒有訪問Teradata的權限,因此該查詢未經測試,但我想認為它已經接近了:
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
您可能簡化了現有查詢,因為這不是有效的Oracle SQL(內聯視圖中沒有GROUP BY)。 另外,您可以在NOT IN branch_no
與branch_code
進行比較。
否則,Ed Gibbs的答案可以進一步簡化為:
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
如果branch_no
被定義為NULLable,則還應該將NOT IN
重寫為NOT EXISTS
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.