teradata中的rownum等价物

时间:2015-04-20 15:39:51

标签: teradata rownum

如何将以下查询(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)

感谢。

5 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:2)

Teradata特别没有像Oracle中那样附加到表中的行的任何rownumber。

但它有两个分析函数,如ROW_NUMBER()和RANK(),它们会为你的行提供一个数字,然后你可以相应地选择数据。

您可以使用以下内容:

QUALIFY ROW_NUMBER()(按日期按ID顺序分区)= 1

此处,可以使用一列或几列分区来对数据进行分组,例如假设表中的某个id列和order by将根据您提供的列的顺序对表中该ID的数据进行排序和= 1表示然后选择该行的行,该行的行号为1。

答案 2 :(得分:1)

使用如下所示的东西:

    row_number() over(partition by '' order by statusid asc) as rownum_1
qualify rownum_1 = 1

上述声明模仿了oracle的rownum功能。

答案 3 :(得分:0)

你可以使用row_number。在计算行号时请记住要考虑的列。您可以使用相同的资格。 其他选项是dense_rank,rank等。在你的情况下,你可以在子查询中使用rank并将条件rank = 1.如果你想要语法,请告诉我。

答案 4 :(得分:0)

当你使用这个调整来提高效率时,我想,QUALIFY ROW_NUMBER()和其他窗口函数在大量使用CPU期间不会让你失望。

你可以简单地删除这部分,Teradata应该没问题。