Teradata中Rank函数使用求助:按分组生成递增行号
Teradata分组排名问题解决
问题根源
- Rank函数语法错误:你使用的
rank(列1,列2,列3 desc)不是Teradata实现分组排名的正确写法,必须采用窗口函数+OVER子句的标准语法。 - 多余的GROUP BY:原SQL按
OBJECTDATABASENAME,OBJECTTABLENAME,TABLEKIND,LOGDATE,STATEMENTTYPE分组后,每个分组仅保留一行数据,导致每个组的rank必然为1,与你需要组内多条记录序号递增的需求完全矛盾。
修正后的SQL
SELECT DBB.OBJECTDATABASENAME, DBB.OBJECTTABLENAME, DBB.objecttype AS TABLEKIND, DBB.LOGDATE, DBG.STATEMENTTYPE, -- 用ROW_NUMBER生成组内连续递增的序号,若允许相同序号可替换为RANK() ROW_NUMBER() OVER ( PARTITION BY DBB.OBJECTDATABASENAME, DBB.OBJECTTABLENAME, DBB.objecttype, DBB.LOGDATE, DBG.STATEMENTTYPE ORDER BY DBB.QUERYID, DBB.PROCID -- 用唯一标识排序,确保序号连续 ) 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');
关键说明
- PARTITION BY:指定分组维度,完全匹配你期望的分组列,确保每个分组内独立计算排名。
- ORDER BY:必须指定组内排序依据,这里用
QUERYID+PROCID是因为二者能唯一标识同一分组下的不同行,保证生成的序号连续且唯一。你也可以根据业务需求替换为其他合适的排序字段。 - ROW_NUMBER vs RANK:从你给出的期望结果来看,
ROW_NUMBER()更适配——它会生成连续不重复的序号;如果业务允许同一分组内出现重复序号(比如排序字段值相同时),可以替换为RANK()。
内容的提问来源于stack exchange,提问作者gfernandes
相关产品推荐
相关产品推荐

