免费注册 查看新帖 |

Chinaunix

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

求教ORACLE大牛,怎么从分组中每组随机取出特定数目的记录? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-15 15:11 |只看该作者 |倒序浏览
20可用积分
比方说排序后为
1 a
1 s
1 d
1 f
2 g
2 h
2 j
2 k
2 l
2 q
2 w
2 e
2 r
3 t
3 y
3 u
3 i
3 o
我想每样随机取出3条得到如下结果,应该怎么做?
1 a
1 s
1 d
2 g
2 h
2 j
3 t
3 y
3 u

组的话有无数组(如 1 2 3 4 5 6 9 10 21),不要源代码级别穷举的方法,谢谢

最佳答案

查看完整内容

使用“分析函数”以下是DB2的SQL,Oracle 应该是类似的:

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
2 [报告]
发表于 2010-12-15 15:11 |只看该作者
使用“分析函数”
以下是DB2的SQL,Oracle 应该是类似的:
  1. select
  2.           col1
  3.           ,col2
  4. from (
  5.          select
  6.                     col1
  7.                    ,col2
  8.                    ,rank() over(partition by col1 order by col2) as rank
  9.          from tab
  10. )
  11. where rank <= 3
复制代码

论坛徽章:
1
射手座
日期:2014-03-10 14:24:52
3 [报告]
发表于 2010-12-15 15:39 |只看该作者
留座学习。听说sqlserver有top用法。

oracle里是不是得写个方法或者过程什么的。
rownum<4
order by ...

论坛徽章:
0
4 [报告]
发表于 2010-12-15 16:05 |只看该作者
回复 2# davidbeckham921


    单个还好处理,问题是现在客户要求每组随机取样80个,让我欲哭无泪,好像非得写PROC不可

论坛徽章:
0
5 [报告]
发表于 2010-12-15 16:12 |只看该作者
with test as (
select 1 id ,'a' value from dual union all
select 1 id ,'s' value from dual union all
select 1 id ,'d' value from dual union all
select 1 id ,'f' value from dual union all
select 2 id ,'g' value from dual union all
select 2 id ,'h' value from dual union all
select 2 id ,'j' value from dual union all
select 2 id ,'k' value from dual union all
select 2 id ,'l' value from dual union all
select 2 id ,'q' value from dual union all
select 2 id ,'w' value from dual union all
select 2 id ,'e' value from dual union all
select 2 id ,'r' value from dual union all
select 3 id ,'t' value from dual union all
select 3 id ,'y' value from dual union all
select 3 id ,'u' value from dual union all
select 3 id ,'i' value from dual union all
select 3 id ,'o' value from dual)
select id ,value from (
select id ,value,row_number() over(partition by id order by
dbms_random.value()) rn from test) t
where t.rn<4
这样是否可用?

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
6 [报告]
发表于 2010-12-16 08:34 |只看该作者
恩   通过row_number  结合 partition  及rownum

4楼正解

论坛徽章:
0
7 [报告]
发表于 2010-12-16 08:42 |只看该作者
哎,好像大家都没看懂偶的题目
结贴吧
还是直接写存储过程不用想了
谢了

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
8 [报告]
发表于 2010-12-16 09:07 |只看该作者
回复 6# duolanshizhe


    4楼明显是不正确的啊。他把数据写死的。5楼看着还有点像样。

论坛徽章:
3
CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43
9 [报告]
发表于 2010-12-16 09:18 |只看该作者
晕  四楼那是自己构造数据

原来就是这样  五楼就是按照这个思路把表套进去了

论坛徽章:
0
10 [报告]
发表于 2010-12-16 10:10 |只看该作者
看是不是要这种效果。

CREATE TABLE test(id NUMBER(5),name VARCHAR2(20));

INSERT INTO test VALUES(1 ,'a');
INSERT INTO test VALUES(1 ,'s');
INSERT INTO test VALUES(1 ,'d');
INSERT INTO test VALUES(1 ,'f');
INSERT INTO test VALUES(2 ,'g');
INSERT INTO test VALUES(2 ,'h');
INSERT INTO test VALUES(2 ,'j');
INSERT INTO test VALUES(2 ,'k');
INSERT INTO test VALUES(2 ,'l');
INSERT INTO test VALUES(2 ,'q');
INSERT INTO test VALUES(2 ,'w');
INSERT INTO test VALUES(2 ,'e');
INSERT INTO test VALUES(2 ,'r');
INSERT INTO test VALUES(3 ,'t');
INSERT INTO test VALUES(3 ,'y');
INSERT INTO test VALUES(3 ,'u');
INSERT INTO test VALUES(3 ,'i');
INSERT INTO test VALUES(3 ,'o');


SELECT b.id,b.name FROM
(SELECT a.id nid ,MIN(ROWNUM) nSeq FROM test a GROUP BY a.id) a,(SELECT ROWNUM nSeq1,id,name FROM test ORDER BY id) b
WHERE a.nid=b.id
AND b.nseq1<a.nseq+3
ORDER BY b.id,b.name
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP