簡體   English   中英

在Teradata中達到QUALIFY ROW_NUMBER

[英]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 BYHAVING之后,倒數第二個計算值,例如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_nobranch_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM