[英]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.