oracle随机分组方法,Oracle中随机获得分组中的一条记录[Oracle防范]

赞助商链接

本文“Oracle中随机获得分组中的一条记录[Oracle防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

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.typefrom ( select row_number() over(partition by a1.title order by sys_guid()) rcn, a1.title, a1.type from a a1 ) awhere a.rcn=1;

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

相信假如不用over, partition,大概还有别的办理筹划.

以上是“Oracle中随机获得分组中的一条记录[Oracle防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值