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 1
1001 A 100000.00 2
1003 B 65000.00 3
 
 
rank() over (partition by ... order by ... )用法
 
按storeid分组,然后在每个storeid内对sales降序排序。
 
 
SELECT storeid, prodid, sales, RANK()
OVER (PARTITION BY storeid ORDER BY sales DESC)AS Rank_Sales
FROM salestbl
QUALIFY Rank_Sales <= 3
;
 
storeid       prodid    sales          Rank_Sales
-------       -------   ---------      ---------
1001          F         150000         1
1001          A         100000         2
1001          C         60000          3
1002          A         40000          1
1002          C         35000          2
1002          D         25000          3
1003          B         65000          1
1003          D         50000          2
1003          A         30000          3
 
 
找出销售额top3的prodid。
 

SELECT Prodid, Sumsales, RANK( ) OVER (ORDER BY Sumsales DESC) AS "Ranking"
FROM (SELECT prodid, SUM(sales)
      FROM salestbl
      GROUP 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 1
10 2004-02-17 550.00 1
10 2004-02-20 450.00 3
10 2004-02-06 350.00 4
10 2004-02-27 350.00 4
10 2004-01-05 350.00 4
10 2004-01-03 250.00 7
10 2004-02-03 250.00 7
10 2004-01-25 200.00 9
10 2004-01-02 200.00 9
10 2004-01-21 150.00 11
10 2004-02-01 150.00 11
10 2004-01-01 150.00 11
10 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 1
10 2004-02-17 550.00 2
10 2004-02-20 450.00 3
10 2004-02-06 350.00 4
10 2004-02-27 350.00 5
10 2004-01-05 350.00 6
10 2004-01-03 250.00 7
10 2004-02-03 250.00 8
10 2004-01-25 200.00 9
10 2004-01-02 200.00 10
10 2004-01-21 150.00 11
10 2004-02-01 150.00 12
10 2004-01-01 150.00 13
10 2004-01-31 100.00 14

Teradata 的rank() 和 row_number() 函数的更多相关文章

  1. Oracle 的开窗函数 rank,dense_rank,row_number

    1.开窗函数和分组函数的区别 分组函数是指按照某列或者某些列分组后进行某种计算,比如计数,求和等聚合函数进行计算. 开窗函数是指基于某列或某些列让数据有序,数据行数和原始数据数相同,依然能曾现个体数据 ...

  2. rank,dense_rank和row_number函数区别

    我对技术一般抱有够用就好的态度,一般在网上或者书上找了贴合的解决方案,放到实际中发现好用就行了,不再深究,等出了问题再说. 因此,我对Oracle中中形成有效序列的方法集中在rownum,row_nu ...

  3. [转]oracle分析函数Rank, Dense_rank, row_number

    oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number)   目录 ==================== ...

  4. hive的row_number()函数

    hive的row_number()函数 功能 用于分组,比方说依照uuid分组 组内可以依照某个属性排序,比方说依照uuid分组,组内按照imei排序 语法为row_number() over (pa ...

  5. oracle分析函数Rank, Dense_rank, row_number

    http://www.cnblogs.com/wuyisky/archive/2010/02/24/oracle_rank.html 目录=============================== ...

  6. ROW_NUMBER()函数的使用

    SQL Server数据库ROW_NUMBER()函数的使用是本文我们要介绍的内容,接下来我们就通过几个实例来一一介绍ROW_NUMBER()函数的使用. 实例如下: .使用row_number()函 ...

  7. SQL Server数据库ROW_NUMBER()函数使用详解

    SQL Server数据库ROW_NUMBER()函数使用详解 摘自:http://database.51cto.com/art/201108/283399.htm SQL Server数据库ROW_ ...

  8. T-SQL利用Row_Number函数实现分页

    SQL: CREATE PROCEDURE PagingViewTest ( @currentPageIndex INT, --页序号 @pageSize INT, --页大小 @pageCount ...

  9. 【ROW_NUMBER 函数(Transact-SQL)】

    [ROW_NUMBER 函数(Transact-SQL)]返回结果集分区内行的序列号,每个分区的第一行从 1 开始. 注释: ROW_NUMBER() OVER (PARTITION BY COL1 ...

随机推荐

  1. emoji表情符处理替换成空格

    /**    * 用filterOffUtf8Mb4    * Description: 过滤率四个字节的utf-8字符(emoji表情符),替换成四个空格.    *         四字节utf- ...

  2. Javascript中对象类型的参数传递

    function setName(obj){ obj.name = 'Niccholas'; console.log(obj.name); //Niccholas obj = new Object() ...

  3. android 底部tabview模板

    以下只是我个人的浅见,大神请忽略~ 底部tab的实现如下图: 现在实现这种界面是有很多方法的,但是对于android新手来说,实现这样的界面还是有难度的. 在网上找到了一个别人写好的底部tab模板,修 ...

  4. 【转载】存储过程实现FTP上传下载

    CREATE OR REPLACE PACKAGE ftp AS -- ---------------------------------------------------------------- ...

  5. cocos2d-x中Node中重要的属性

    Node还有两个非常重要的属性:position和anchorPoint. position(位置)属性是Node对象的实际位置.position属性往往还要配合使用anchorPoint属性,为了将 ...

  6. dateset是不是在缓存中

    C#开发erp系统的时候有一个多表数据的查询展示到页面,采用了存储过程的方式,但是存储过程中没有加入分页(菜比).刚开始测试数据几百条没有问题,当数据量提升至十万级后页面加载速度就很卡了,一般是使用分 ...

  7. JSLint notepad++使用

    1.JSLint简介 JSLint定义了一组编码约定,这比ECMA定义的语言更为严格.这些编码约定汲取了多年来的丰富编码经验,并以一条年代久远的编程原则 作为宗旨:能做并不意味着应该做.JSLint会 ...

  8. [Bootstrap]组件(四)

    导航条 移动设备上折叠(可开关),超过规定视口标签时候水平展开模式 依赖插件 注意点:导航条内元素过多或其他原因导致元素内元素宽度过长,会引起折行-->解决:a.减少导航内元素或者减少宽度  b ...

  9. hdu 2176 取(m)石子游戏

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2176 题意分析:给出M堆石子,两人交替取子,给出先手能否胜利. 不能输出No, 能则输出Yes并给出第 ...

  10. How to Get Rid of /wordpress/ From your WordPress Site URL

    I brought up a website using wordpress, but I had to visit my website in a way I don't like -- www.e ...