查询计算每个地区亏损前10名的语句的写法

本文介绍了如何使用SQL查询每个地区亏损前10名的情况,包括使用DENSE_RANK()、RANK()和ROW_NUMBER()函数进行排名,并解决地区之间的排序问题。

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

查询计算每个地区亏损前10名的语句的写法

代码:--------------------------------------------------------------------------------
下面2个语句均可以达到计算亏损前10名的要求
  
SQL>select * from (select rank() over(order by b04_50) 名次, b04_50 "亏损总额" from cj604 where b04_50<-1000  ) where rownum<=10;

      名次   亏损总额
---------- ----------
         1   
         2   
         3   
         4   
         5   
         6   
         7   
         8   
         9   
        10   
       
SQL> select rownum 名次,a.* from (select b04_50 "亏损总额" from cj604 where b04_50<-1000 order by b04_50 ) a where rownum<=10;

      名次   亏损总额
---------- ----------
         1   
         2   
         3   
         4   
         5   
         6   
         7   
         8   
         9   
        10   
       
如何才能实现计算每个地区亏损前10名,按地区码排序,问题是一个地区的前10可能比另一个地区前10大或小或在中间,如下面71/72就是混在一起的
SQL> select rownum 名次,a.* from (select substr(z01_04,1,2) 地区码,b04_50 "亏损总额" from cj604 where b04_50<0  order by b04_50 ) a where rownum<=10;

      名次 地区   亏损总额
---------- ---- ----------
         1 71     
         2 72     
         3 72     
         4 71     
         5 71     
         6 71     
         7 72     
         8 71     
         9 72     
        10 71     
自己试验出来了

代码:--------------------------------------------------------------------------------
select * from (select  substr(z01_04,1,2) 地区码,DENSE_RANK() OVER (PARTITION BY substr(z01_04,1,2) order by b04_50) 名次, b04_50 "亏损总额" from jb604,j601 where b04_50<0 and j601.uuid=jb604.uuid  ) where 名次<=10;

------------------------------------------------------------------------------------
这里不想多说其他的, 不过希望LZ自己注意你是该用 dense_rank()还是rank()还是row_number()

前十名? 是否有并列的? 如果出现并列怎么处理?


代码:--------------------------------------------------------------------------------
SQL> select id, num,
  2         dense_rank() over(partition by id order by num desc) as dr,
  3         rank() over(partition by id order by num desc) as r,
  4         row_number() over(partition by id order by num desc) as rn
  5    from t_rank
  6  /

ID     NUM         DR          R         RN
---- ----- ---------- ---------- ----------
1       14          1          1          1
1       14          1          1          2
1       13          2          3          3
1       13          2          3          4
1       12          3          5          5
1       11          4          6          6
1       11          4          6          7
1       11          4          6          8
1       10          5          9          9
1       10          5          9         10
2       10          1          1          1
2        9          2          2          2
2        8          3          3          3
2        7          4          4          4
2        6          5          5          5
2        5          6          6          6
2        4          7          7          7
2        3          8          8          8
2        2          9          9          9
2        1         10         10         10

20 rows selected

--------------------------------------------------------------------------------------

如果上面的数据, 我要选择不同ID的前3名, 大家觉得要怎么处理呢?
用where dr<=3? where r<=3? 还是 where rn<=3?


__________________
平凡的伟大, 伟大的平凡

msn : jackywood_24@hotmail.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值