免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1728 | 回复: 0
打印 上一主题 下一主题

利用分析函数在Oracle中分组排序取首条或末条记录行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:54 |只看该作者 |倒序浏览
    在工作中,我们经常会使用到按时间或指定字段进行排序,并提取首条/末条记录的操作,而Oracle中的分析函数让我们能够方便快捷地实现这个功能,下面实例的详细情况:

1、建立测试数据表

  1. create table sail_test
  2. (group_id number(3),
  3.  order_id number(3),
  4.  other1 varchar2(8),
  5.  other2 varchar2(8));
2、插入测试数据

  1. insert into sail_test values (1, 1, 'g1_o11', 'g1_o21');
  2. insert into sail_test values (1, 2, 'g1_o12', 'g1_o22');
  3. insert into sail_test values (1, 3, 'g1_o13', 'g1_o23');
  4. insert into sail_test values (1, 4, 'g1_o14', 'g1_o24');
  5. insert into sail_test values (2, 1, 'g2_o11', 'g2_o21');
  6. insert into sail_test values (2, 2, 'g2_o12', 'g2_o22');
  7. insert into sail_test values (2, 3, 'g2_o13', 'g2_o23');
  8. insert into sail_test values (3, 1, 'g3_o11', 'g3_o21');
  9. insert into sail_test values (3, 2, 'g3_o12', 'g3_o22');
  10. insert into sail_test values (3, 3, 'g3_o13', 'g3_o23');
其中,group_id是分组的字段,order_id是排序字段,下面是所有数据的快照:

  1. GROUP_ID ORDER_ID OTHER1 OTHER2
  2. -------- -------- -------- --------
  3.        1 1 g1_o11 g1_o21
  4.        1 2 g1_o12 g1_o22
  5.        1 3 g1_o13 g1_o23
  6.        1 4 g1_o14 g1_o24
  7.        2 1 g2_o11 g2_o21
  8.        2 2 g2_o12 g2_o22
  9.        2 3 g2_o13 g2_o23
  10.        3 1 g3_o11 g3_o21
  11.        3 2 g3_o12 g3_o22
  12.        3 3 g3_o13 g3_o23
3、我们现在想查询出各个group_id中,order_id最小的那个记录行,下面是SQL:

  1. -- 以group_id分组,按照order_id排序(可以是倒序,order by语句后面加desc,取首条记录
  2. select distinct a.group_id,
  3.        first_value(a.other1) over (partition by a.group_id order by order_id),
  4.        first_value(a.other2) over (partition by a.group_id order by order_id)
  5. from sail_test a
  6. order by a.group_id;
查询结果为:

  1. GROUP_ID FIRST_VALUE(A.OTHER1)OVER(PART FIRST_VALUE(A.OTHER2)OVER(PART
  2. -------- ------------------------------ ------------------------------
  3.        1 g1_o11 g1_o21
  4.        2 g2_o11 g2_o21
  5.        3 g3_o11 g3_o21
4、总结

Oracle中的分析函数使用很方便,在本例子中通过over来指定分组字段和排序字段的范围,通过first_value或last_value函数来获取首条或末条记录字段值,排序可以是顺序或倒序,而distinct则指定获取一条记录行。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP