Teradata中的rank() 和 row

编程入门 行业动态 更新时间:2024-10-07 02:18:33

<a href=https://www.elefans.com/category/jswz/34/1754317.html style=Teradata中的rank() 和 row"/>

Teradata中的rank() 和 row

Teradata数据库中也有和oracle类似的分析函数,功能基本一样。示例如下:

  • RANK() 函数
SELECT * FROM salestbl ORDER BY 1,2;storeid     prodid      sales
----------- -------	---------
1001 	    A 		100000.00		
1001 	    C 		60000.00		
1001 	    D 		35000.00		
1001 	    F 		150000.00		
1002 	    A 		40000.00		
1002 	    C 		35000.00		
1002 	    D 		25000.00		
1003 	    A 		30000.00		
1003 	    B 		65000.00		
1003 	    C 		20000.00		
1003 	    D 		50000.00	

按sales排序,找出top 3的记录。

SELECT storeid,prodid,sales,RANK() OVER (ORDER BY sales DESC) AS Rank_Sales
FROM salestbl
QUALIFY rank_sales <= 3;storeid  prodid        sales   Rank_Sales
-----------  ------  -----------  -----------1001  F         150000.00            11001  A         100000.00            21003  B          65000.00            3

找出销售额top3的prodid

SELECT Prodid,Sumsales,RANK( ) OVER (ORDER BY Sumsales DESC) AS "Ranking"
FROM (SELECT prodid,SUM(sales)FROM salestblGROUP BY 1) AS dt(Prodid, Sumsales)
QUALIFY Ranking <= 3;Prodid     Sumsales      Ranking
------  -----------  -----------
A         170000.00            1
F         150000.00            2
C         115000.00            3

用rank() 按sales降序排序,如果sales相同,则排名相同。

SELECT itemid, salesdate, sales, RANK() OVER (ORDER BY sales DESC)
WHERE salesdate BETWEEN DATE '2004-01-01' AND DATE '2004-03-01'AND itemid = 10
FROM daily_sales_2004;itemid   salesdate        sales  Rank(sales)
-----------  ----------  -----------  -----------10  2004-01-10       550.00            110  2004-02-17       550.00            110  2004-02-20       450.00            310  2004-02-06       350.00            410  2004-02-27       350.00            410  2004-01-05       350.00            410  2004-01-03       250.00            710  2004-02-03       250.00            710  2004-01-25       200.00            910  2004-01-02       200.00            910  2004-01-21       150.00           1110  2004-02-01       150.00           1110  2004-01-01       150.00           1110  2004-01-31       100.00           14
  • ROW_NUMBER () 函数

用row_number() 按sales降序排序时,即使sales相同,排名也不同。

SELECT itemid,salesdate,sales,ROW_NUMBER() OVER (ORDER BY sales DESC)
WHERE salesdate BETWEEN DATE '2004-01-01' AND DATE '2004-03-01'AND itemid = 10
FROM daily_sales_2004;itemid   salesdate        sales  Row_Number()
-----------  ----------  -----------  ------------10  2004-01-10       550.00             110  2004-02-17       550.00             210  2004-02-20       450.00             310  2004-02-06       350.00             410  2004-02-27       350.00             510  2004-01-05       350.00             610  2004-01-03       250.00             710  2004-02-03       250.00             810  2004-01-25       200.00             910  2004-01-02       200.00            1010  2004-01-21       150.00            1110  2004-02-01       150.00            1210  2004-01-01       150.00            1310  2004-01-31       100.00            14

Qualify

使用ROW_NUMBER行号排序函数实现

SELECT *
FROM (SELECT STATISTICAL_DATE,PROVINCE_CODE,TOTAL_SCORE,ROW_NUMBER() OVER(PARTITION BY PROVINCE_CODE ORDER BY TOTAL_SCORE) AS SCORE_ROWNUMBERFROM XXX) T1
WHERE T1.SCORE_ROWNUMBER = 1

上面的实现方式都比较复杂,语句较多,teradata 中的qualify 函数,提供了一种更为简便的方式:

SELECT STATISTICAL_DATE,PROVINCE_CODE,TOTAL_SCORE
FROM XXX 
QUALIFY ROW_NUMBER() OVER(PARTITION BY PROVINCE_CODE ORDER BY TOTAL_SCORE) = 1

或者可以这么写:

SELECT STATISTICAL_DATE,PROVINCE_CODE,TOTAL_SCORE,ROW_NUMBER() OVER(PARTITION BY PROVINCE_CODE ORDER BY TOTAL_SCORE) AS SCORE_RANK
FROM XXX 
QUALIFY SCORE_RANK = 1

需要注意的是:
当WHERE, GROUP BY和QUALIFY顺序:WHERE –> GROUP–>QUALIFY

QUALIFY与WHERE、HAVING的不同在于QUALIFY和Ordered Analytical Functions一起使用。后面两中方式任何一种换做WHERE或HAVING都是报错的

更多推荐

Teradata中的rank() 和 row

本文发布于:2024-02-07 06:24:38,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1754452.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Teradata   rank   row

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!