over partition by order by rows|range(6)之rank()和dense_rank()

本文介绍了SQL中rank()和dense_rank()函数在数据排序和分配序号时的应用。当遇到相同数据时,rank()会跳过序号,而dense_rank()则保持序号连续。通过示例展示了在特定分区和排序条件下,这两个函数如何对销售数据进行排名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前文中的First_value、Last_value和Nth_value用于提取指定的行

某些时候,我们需要对分区中的数据进行排序,并得到序号,

这样,rank()和dense_rank()函数就用上了。

rank() over(partition by ... order by ...)

dense_rank() over(partition by ... order by ...)

rank和dense_rank不支持开窗语句

如果出现相同的行,那么rank函数将跳过这些行,形成新的排名

而dense_rank则形成连续的排名

示例:

第一步,创建一个具有相同sale的数据行

update sales_fact set sale='2008.10' where id_=1801;

SQL如下:

select id_,
year,week,product,
sale,
rank() over ( 
partition by product,region,country,year
order by sale
) rank_sale,
dense_rank() over (
partition by product,region,country,year
order by sale
) dense_rank_sale
from sales_fact
where product='product1' and country='country1' and region='region1'
order by product,country,year,week

结果集如下:

       ID_       YEAR       WEEK PRODUCT                      SALE  RANK_SALE DENSE_RANK_SALE
---------- ---------- ---------- -------------------- ------------ ---------- ---------------
         1       2000          1 product1                  2003.10          1               1
       301       2000          2 product1                  2004.10          2               2
       601       2000          3 product1                  2005.10          3               3
       901       2000          4 product1                  2006.10          4               4
      1201       2000          5 product1                  2007.10          5               5
      1501       2000          6 product1                  2008.10          6               6
      1801       2000          7 product1                  2008.10          6               6

      2101       2000          8 product1                  2010.10          8               7
      2401       2000          9 product1                  2011.10          9               8
      2701       2000         10 product1                  2012.10         10               9

绿色数据为sale相同的数据,序号均为6

红色数据的时候,rank()函数返回8,跳过了7

而dense_rank()函数返回7,序号连续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值