【问题标题】:rank function in TeradataTeradata 中的排名函数
【发布时间】:2022-12-17 16:56:56
【问题描述】:

我正在尝试使用排名功能但失败了,你们能帮我一些忙吗?

在这里你可以看到一些尝试:

SELECT DBB.OBJECTDATABASENAME,
    DBB.OBJECTTABLENAME,
    DBB.objecttype AS TABLEKIND,
    DBB.LOGDATE,
    DBG.STATEMENTTYPE,
    rank(DBB.OBJECTDATABASENAME, DBB.OBJECTTABLENAME, DBB.objecttype desc) as row_rank
    --rank() over (order by DBB.OBJECTTABLENAME  desc) as row_rank
    --rank() over (order by DBB.OBJECTDATABASENAME, DBB.OBJECTTABLENAME, DBB.objecttype desc) as row_rank
    FROM PDCRINFO.DBQLOBJTBL_HST_v1620 DBB
    LEFT JOIN PDCRINFO.DBQLogTbl_HsT_v1620 DBG    
        ON DBG.QUERYID = DBB.QUERYID
        AND DBG.LOGDATE = DBB.LOGDATE
        AND DBG.PROCID = DBB.PROCID
    LEFT JOIN PDCRINFO.DBQLSQLTBL_HST QRY
        ON QRY.LOGDATE = DBB.LOGDATE
        AND QRY.QUERYID = DBB.QUERYID
        AND QRY.PROCID = DBB.PROCID
    WHERE DBB.LOGDATE = ('2022-11-27')
        AND  DBB.OBJECTTYPE IN ('Tab', 'Viw')
        AND  SQLROWNO = 1
        AND DBB.OBJECTDATABASENAME = 'PM_MSTRDB'
        AND DBB.OBJECTTABLENAME = 'STATUS_SUBPRODUTO_V'
   GROUP BY 1,2,3,4,5;

这是我从我的尝试中得到的:

OBJECTDATABASENAME  OBJECTTABLENAME TABLEKIND   LOGDATE STATEMENTTYPE   row_rank
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1

这里是我正在寻找的输出:

OBJECTDATABASENAME  OBJECTTABLENAME TABLEKIND   LOGDATE STATEMENTTYPE   row_rank
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  1
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  2
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  3
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  4
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  5
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  6
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  7
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  8
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  9
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  10
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  11
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  12
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  13
PM_MSTRDB   STATUS_SUBPRODUTO_V Viw 27/11/2022  Select  14

可以看到,where子句中提到的selected values的key (OBJECTDATABSENAME,OBJECTTABLENAME,objecttype,LOGDATE,STATEMENTTYPE)返回14行,我想枚举这14行。

【问题讨论】:

  • 我不知道 Teradata,但是 - 你没有说出什么问题。您发布了一些您想要的代码和输出,但我们不知道您运行该代码时发生了什么。你有什么错误吗?如果有,是哪一个?如果不是,发生了什么?
  • 我会修改我的帖子...谢谢你的建议

标签: plsql teradata


【解决方案1】:

Documentation

等级 r 表示恰好存在 r-1 行,其前面有 sort_expression 值。具有相同 sort_expression 值的所有行都分配相同的排名.

这发生在你的情况 - 所有行共享相同的等级:1


你试过row_number吗?

select ...,
  row_number() over (order by DBB.OBJECTDATABASENAME, DBB.OBJECTTABLENAME, DBB.objecttype desc) rn
from ...

请参阅(相同的)文档页面;它也解释了row_number。也许您还需要包含 partition by 子句;不知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 2023-02-24
    • 2018-10-06
    • 2019-01-18
    • 2016-10-01
    相关资源
    最近更新 更多