【发布时间】:2015-06-27 10:32:59
【问题描述】:
如何将以下查询(oracle)中的 rownum 转换为等效的 teradata:
and not exists(select 1
from CSE, SPD
WHERE cse.id=spd.id
AND ROWNUM = 1
AND CSE.STATUSID IN(6,7,8,13)
谢谢。
【问题讨论】:
如何将以下查询(oracle)中的 rownum 转换为等效的 teradata:
and not exists(select 1
from CSE, SPD
WHERE cse.id=spd.id
AND ROWNUM = 1
AND CSE.STATUSID IN(6,7,8,13)
谢谢。
【问题讨论】:
Teradata 中没有 ROWNUM,但您通常可以使用 ROW_NUMBER 加上 QUALIFY 来重写它。
在您的情况下,根本不需要 ROWNUM(至少在逻辑上,也许 Oracle 更喜欢它做一个更好的计划),这完全一样:
and not exists(select *
from CSE, SPD
WHERE cse.id=spd.id
AND CSE.STATUSID IN(6,7,8,13)
【讨论】:
Teradata 并不像在 Oracle 中那样将任何行号附加到表中的行。
但它有两个分析函数,如 ROW_NUMBER() 和 RANK(),它们会给你的行一个数字,然后你可以相应地选择你的数据。
您可以使用以下内容:
QUALIFY ROW_NUMBER()(Partition by Id order by date)=1
在这里,可以使用一列或几列的分区依据来对数据进行分组,例如假设表中的某个 id 列和 order by 将根据您提供的 order by 列对表中该 id 的数据进行排序和 =1 表示它然后选择该 id 的行,其行号为 1。
【讨论】:
使用类似下面的东西:
row_number() over(partition by '' order by statusid asc) as rownum_1
qualify rownum_1 = 1
上面的语句模仿了oracle的rownum功能。
【讨论】:
您可以使用 row_number。请记住在计算行号时要考虑的列。您可以使用相同的资格。 其他选项是dense_rank,rank等。在您的情况下,您可以在子查询中使用rank并将条件rank = 1。如果您想要语法,请告诉我。
【讨论】:
当您使用此调整来提高效率时,我想 QUALIFY ROW_NUMBER() 和其他窗口函数在大量使用 CPU 期间将不适合您。
你可以简单地删除这部分,Teradata应该没问题。
【讨论】: