【问题标题】:QUALIFY ROW_NUMBER in teradatateradata 中的 QUALIFY ROW_NUMBER
【发布时间】:2014-01-03 22:37:33
【问题描述】:

以下是 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 来获得如下排名。

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 之间的错误。

我们可以在 select 语句中加入 QUALIFY 吗?

【问题讨论】:

    标签: sql oracle teradata


    【解决方案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

    【讨论】:

      【解决方案2】:

      通常情况下,像RANK 这样的分析值会在加入和过滤以及GROUP BYHAVING 之后倒数第二个计算。解析值之后唯一要做的事情是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
      

      【讨论】:

      • 谢谢它的帮助。
      猜你喜欢
      • 2013-07-06
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 2018-05-05
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      相关资源
      最近更新 更多