oracle row_number()函数的小实例

本文介绍了SQL中row_number()函数的应用场景与实现方法。通过两个具体实例展示了如何利用该函数进行左连接操作及筛选最大时间的数据记录。

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

  1. //实例1:   
  2. //ta表   
  3. A B C  
  4. 1 2 3  
  5. 1 2 4  
  6. 1 2 5  
  7. 1 2 6  
  8. //tb表   
  9. A B D  
  10. 1 2 100  
  11. 1 2 200  
  12. 1 2 300  
  13. //结果:   
  14. A B C D  
  15. 1 2 3 100  
  16. 1 2 4 200  
  17. 1 2 5 300  
  18. 1 2 6  
  19. //分析:   
  20. //典型的左连接问题,但是这里需要将相应的行对应到指定的行上去,   
  21. //我们使用row_number()函数来做:   
  22. with ta as(  
  23.      select 1 a,2 b,3 c from dual union all  
  24.      select 1,2,4 from dual union all  
  25.      select 1,2,5 from dual union all  
  26.      select 1,2,6 from dual)  
  27. ,tb as(  
  28.     select 1 a,2 b,100 c from dual union all  
  29.     select 1,2,200 from dual union all  
  30.     select 1,2,300 from dual)  
  31. select a.a,a.b,a.c,b.c  
  32. from (select ta.*  
  33.             ,row_number() over (partition by a,b order by rownum) rn  
  34.       from ta) a,  
  35.      left join  
  36.      (select tb.*  
  37.             ,row_number() over (partition by a,b order by rownum) rn  
  38.       from tb) b  
  39.  on a.a=b.a  
  40. and a.b=b.b  
  41. and a.rn=b.rn  
  42. //where a.a=b.b(+)   
  43. //我们知道,关于左连接有两种方式:   
  44. //1.使用关键词 left join   
  45. //2.使用 "+"   
  46. //我们这里为什么使用关键词 left join 呢?   
  47. //因为这里有多个连接条件,更易于使用 left join   
  48. //   
  49. //实例2   
  50. //下面是一张表,   
  51. //取出每个NAME 对应时间对大的数据   
  52. NAME TYPE TIME   
  53. 1 C2 12:00  
  54. 1 C3 13:00  
  55. 1 C5 14:00  
  56. 2 C1 12:00  
  57. 3 C4 12:00  
  58. 4 C5 12:00  
  59. 4 C6 14:00  
  60. //结果:   
  61. NAME TYPE TIME   
  62. 1 C5 14:00  
  63. 2 C1 12:00  
  64. 3 C4 12:00  
  65. 4 C6 14:00  
  66. //   
  67. with t as(  
  68.      select 1 name,'C2' type,'12:00' time from dual union all  
  69.      select 1,'C3','13:00' from dual union all  
  70.      select 1,'C5','14:00' from dual union all  
  71.      select 2,'C1','12:00' from dual union all  
  72.      select 3,'C4','12:00' from dual union all  
  73.      select 4,'C5','12:00' from dual union all  
  74.      select 4,'C6','14:00' from dual)  
  75. select name,type,time  
  76. from (  
  77.       select name  
  78.      ,type  
  79.      ,time  
  80.      ,row_number() over (partition by name order by time desc) rn  
  81.      from t) a  
  82. where a.rn=1  
  83. /  
  84.       NAME TYPE TIME  
  85. ---------- ---- -----  
  86.          1 C5   14:00  
  87.          2 C1   12:00  
  88.          3 C4   12:00  
  89.          4 C6   14:00  
  90. //row_number()评级函数是根据每一个分组,按照指定的列排序,然后返回一个rownum值   
  91. //上面两个实例,我们都借助了row_number()函数,返回一个分组排序后的行编号,   
  92. //然后根据具体的需要,使用这个行编号  
 

原帖:http://topic.youkuaiyun.com/u/20090618/09/1795e0bc-b874-4fb1-8959-799231482bce.html?67906

row_number()函数:

http://blog.youkuaiyun.com/BOBO12082119/archive/2011/04/01/6294889.aspx

Oracle数据库中,多个函数和操作符的组合使用可以实现复杂的数据查询和类型转换。以一个零售企业为例,该企业希望分析销售数据中,哪些商品在特定时间段内的销售额有所下降。我们可以利用TO_DATE来筛选特定日期范围的销售记录,使用ROW_NUMBER() OVER()进行排序,然后应用MINUS操作符来比较不同时间段的数据。TO_CHAR可以用来格式化日期和数字,以便在查询结果中以人类可读的格式展示。 参考资源链接:[Oracle数据库常用函数详解:MINUS, ROW_NUMBER(), TO_CHAR()等](https://wenku.youkuaiyun.com/doc/3gup417u1o?spm=1055.2569.3001.10343) 以下是实现该需求的SQL示例: ```sql SELECT product_id, TO_CHAR(sales_date, 'YYYY-MM-DD') AS formatted_sales_date, TO_CHAR(sales_amount, '999999.99') AS formatted_sales_amount FROM sales WHERE sales_date BETWEEN TO_DATE('2022-01-01', 'YYYY-MM-DD') AND TO_DATE('2022-12-31', 'YYYY-MM-DD') ORDER BY sales_date DESC ROWNUMBER() OVER (ORDER BY sales_date DESC) ``` 在这个查询中,我们首先筛选出2022年所有销售记录,并将日期和金额字段格式化为易于阅读的格式。然后,我们使用ROW_NUMBER() OVER()窗口函数对结果按销售日期降序排列,并分配行号。最后,假设我们已经有了去年同样时间段内的销售数据,我们可以使用MINUS操作符来比较两年的销售数据,找出销售额下降的商品。 ```sql SELECT product_id, formatted_sales_amount FROM ( SELECT product_id, TO_CHAR(sales_amount, '999999.99') AS formatted_sales_amount, ROW_NUMBER() OVER (ORDER BY sales_date DESC) AS rn FROM sales WHERE sales_date BETWEEN TO_DATE('2022-01-01', 'YYYY-MM-DD') AND TO_DATE('2022-12-31', 'YYYY-MM-DD') ) WHERE rn <= 10 -- 取最近10条记录进行分析 MINUS SELECT product_id, formatted_sales_amount FROM ( SELECT product_id, TO_CHAR(sales_amount, '999999.99') AS formatted_sales_amount, ROW_NUMBER() OVER (ORDER BY sales_date DESC) AS rn FROM sales WHERE sales_date BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD') ) WHERE rn <= 10 -- 取最近10条记录进行分析 ``` 通过这个示例,你可以看到如何结合Oracle数据库的不同函数和操作符来执行深入的数据分析。掌握了这些技能后,你将能够有效地处理和转换数据,执行复杂的数据查询任务。为了进一步提升你的数据库操作能力,我推荐阅读《Oracle数据库常用函数详解:MINUS, ROW_NUMBER(), TO_CHAR()等》。这本书不仅覆盖了这些函数的使用方法,还提供了丰富的实例和最佳实践,帮助你深入理解并掌握它们在不同业务场景中的应用。 参考资源链接:[Oracle数据库常用函数详解:MINUS, ROW_NUMBER(), TO_CHAR()等](https://wenku.youkuaiyun.com/doc/3gup417u1o?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值