【问题标题】:rownum equivlent in teradatateradata 中的 rownum 等效项
【发布时间】: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)

谢谢。

【问题讨论】:

    标签: teradata rownum


    【解决方案1】:

    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)
    

    【讨论】:

      【解决方案2】:

      Teradata 并不像在 Oracle 中那样将任何行号附加到表中的行。

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

      您可以使用以下内容:

      QUALIFY ROW_NUMBER()(Partition by Id order by date)=1

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

      【讨论】:

        【解决方案3】:

        使用类似下面的东西:

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

        上面的语句模仿了oracle的rownum功能。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 语法应该是这样的:选择 A.colA,AcolB from (sel colA,colB,qualify rank() over (partition by colA,colB order by ColC) as rank from table A group by colA,colB) A where A.rank=1 group by A.colA,b.colB ;在您给出的内部查询中使用此 sql。但相关的 coly\umn 名称代替了提到的 cols。如果您遇到问题,请告诉我。
          【解决方案5】:

          当您使用此调整来提高效率时,我想 QUALIFY ROW_NUMBER() 和其他窗口函数在大量使用 CPU 期间将不适合您。

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

          【讨论】:

            猜你喜欢
            • 2014-09-14
            • 2017-04-02
            • 2015-06-13
            • 1970-01-01
            • 2011-12-19
            • 2015-05-28
            • 2018-08-15
            • 1970-01-01
            • 2021-11-27
            相关资源
            最近更新 更多