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防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |