Oracle数据库中随机获取分组中一条记录

时间:2014-8-26 13:54:53

  核心提示:Oracle中随机获取分组中的一条记录原文是这样的:table A :title typeBB 甲CC 甲DD 乙BB 乙-------------------------------查询之后要的结果...

Oracle中随机获取分组中的一条记录

原文是这样的:
table A :
title type
BB 甲
CC 甲
DD 乙
BB 乙
-------------------------------
查询之后要的结果是:
title type
BB 甲
CC 甲
DD 乙
--------------------------------

title有相同值而type不管相不相同时只随机选取一条记录   
1. 最开始,有人这样解答:
随机?
select title, max(type)
from table
group by title

但是,这样做有一个缺点,每次挑出来的都是按照type取最大的那一行。min也是同样道理。
2. 改进一点的随机性:
SQL> select title, type from a where rowid = (select max(rowid) from a b where b.title = a.title);

TITLE TYPE
-------------------------------- ----
CC 甲
DD 乙
BB 乙
为什么说随机性改进了一点点呢?因为这个时候它不是以type的自然值排序,但是它实际上以伪列rowid排序,也就是说,基本上它获取的是相同title值下最后一次插入的行,不一定是最大或最小title值那一行。

3. 使用partition分析函数
QL> select * from (
2 select title ,type, row_number() over(partition by title order by title) r from A
3 ) where r = 1;

TITLE TYPE R
-------------------------------- ---- ----------
BB 甲 1
CC 甲 1
DD 乙 1
这与1没什么区别,order by 的是title,获取的是最小值

4. 改进的随机性

select a.title, a.type
from (
select row_number() over(partition by a1.title order by sys_guid()) rcn, a1.title, a1.type
from a a1 ) a
where a.rcn=1;

其中的sys_guid()可以换为dbms_random.random

相信如果不用over, partition,也许还有别的解决方案

Java学习网  http://www.javalearns.com/

作者:数据小助手 来源:好好生活网
    你是从哪里知道本网站的?
  • 网友介绍的
  • 百度搜索的
  • Google搜索的
  • 其它搜索过来的
  • 网址输错了进来的
  • 太忙了不记得了
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • java学习网(www.javalearns.com) © 2014 版权所有 All Rights Reserved.
  • Email:javalearns@163.com 站长QQ:1356121699 晋ICP备14003680号-3
  • java学习网部分内容来自网络或网友发布,如侵犯了您利益,请发邮件至:javalearns@126.com,我们尽快处理!
  • Java学习网
  • 网站统计
  • 晋公网安备 14042902000001号