oracle row_number()函数的小实例

来源:互联网 发布:mac wav 转 mp3 编辑:程序博客网 时间:2024/06/02 14:25
  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.csdn.net/u/20090618/09/1795e0bc-b874-4fb1-8959-799231482bce.html?67906

row_number()函数:

http://blog.csdn.net/BOBO12082119/archive/2011/04/01/6294889.aspx

原创粉丝点击