楼主: nyfor

[精华] 那个有条件的随机取电影问题用一句SQL实现

[复制链接]
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
11#
 楼主| 发表于 2008-7-3 16:31 | 只看该作者

回复 #7 junsansi 的帖子

我将 sv <= 10 修改为 sv <= 8 , 结果只有7行.

SQL> with tt as(
  2   select filmname ofm,
  3          rtrim(filmname, 'abi') nfm,
  4          count(rtrim(filmname, 'abi')) over(partition by rtrim(filmname, 'abi')) ct,
  5          row_number() over(partition by rtrim(filmname, 'abi') order by 1) rn
  6     from t_film t
  7   )
  8   select ofm
  9     from tt
10    where nfm in (select nfm
11                    from (select a.*, sum(ct) over(order by rownum) sv
12                            from tt a
13                           where rn = 1
14                           order by dbms_random.value)
15                   where sv <= 8)
16  /

OFM
--------------------------------------------------
侏罗纪公园i
侏罗纪公园ii
侏罗纪公园iii
三分钟先生
东方海盗传奇b
东方海盗传奇a
兄弟

7 rows selected

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
12#
 楼主| 发表于 2008-7-3 16:32 | 只看该作者
原帖由 caizhuoyi 于 2008-7-3 16:22 发表
我在10.2.0.3上运行无结果啊!

奇怪怎么会没结果呢?

我的版本是: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0

使用道具 举报

回复
论坛徽章:
9
六级虎吧徽章
日期:2009-01-03 20:00:34
13#
发表于 2008-7-3 16:35 | 只看该作者
同上!10.2.0.1.0可以运行!高版本的肯定能运行低版本的吧!其实没有差多少,都是10g的!

使用道具 举报

回复
论坛徽章:
9
六级虎吧徽章
日期:2009-01-03 20:00:34
14#
发表于 2008-7-3 16:36 | 只看该作者
同上!10.2.0.1.0可以运行!高版本的肯定能运行低版本的吧!其实没有差多少,都是10g的!

使用道具 举报

回复
论坛徽章:
21
红旗
日期:2013-09-30 15:26:01凯迪拉克
日期:2013-10-23 12:48:26比亚迪
日期:2013-11-01 09:19:01奔驰
日期:2013-12-13 09:27:30马上有对象
日期:2014-11-18 10:46:242015年新春福章
日期:2015-04-28 15:24:55慢羊羊
日期:2015-05-28 09:49:31
15#
发表于 2008-7-3 16:41 | 只看该作者
原帖由 sunfly1983 于 2008-7-3 16:22 发表


你的测试结果是8-12条记录随机出现!


如果一个部电影有 ab 12 当然记录就会多一些的

使用道具 举报

回复
论坛徽章:
281
2015年新春福章
日期:2015-03-06 11:57:312012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-01-04 11:51:22蛋疼蛋
日期:2011-12-29 07:37:22迷宫蛋
日期:2011-12-26 14:19:41茶鸡蛋
日期:2011-11-17 09:20:52茶鸡蛋
日期:2011-11-10 22:42:38ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15茶鸡蛋
日期:2011-10-24 09:48:48ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47
16#
发表于 2008-7-3 16:42 | 只看该作者
原帖由 nyfor 于 2008-7-3 16:31 发表
我将 sv  


en,有bug~~

修正之
[php]
SQL> with tt as(
  2  select filmname ofm,
  3         rtrim(filmname, 'abi') nfm,
  4         count(rtrim(filmname, 'abi')) over(partition by rtrim(filmname, 'abi')) ct,
  5         row_number() over(partition by rtrim(filmname, 'abi') order by 1) rn
  6    from t_film t
  7  )
  8  select ofm from(
  9  select ofm from tt where nfm in(
10  select nfm from(
11  select a.*, sum(ct) over(order by rownum) sv
12    from (select * from tt where rn = 1 order by dbms_random.value) a
13           ) where sv <= 12
14  ) order by ct desc) where rownum<=10
15  /

OFM
--------------------------------------------------
太极张三丰b
太极张三丰a
冰河世纪2b
冰河世纪2a
双龙记
爱情呼叫转移
音乐
宝贝计划
破敌
兄弟

10 rows selected

SQL>
--
[/php]

使用道具 举报

回复
论坛徽章:
24
授权会员
日期:2008-07-25 12:30:27咸鸭蛋
日期:2012-03-30 17:00:27灰彻蛋
日期:2012-03-15 17:47:31ITPUB十周年纪念徽章
日期:2011-11-01 16:21:152010广州亚运会纪念徽章:篮球
日期:2011-03-23 17:59:312010广州亚运会纪念徽章:棒球
日期:2011-02-17 08:25:242010广州亚运会纪念徽章:棋类
日期:2011-01-04 08:32:45ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212010新春纪念徽章
日期:2010-03-01 11:08:262010新春纪念徽章
日期:2010-01-04 08:33:08
17#
发表于 2008-7-3 16:45 | 只看该作者

回复 #13 sunfly1983 的帖子

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production

SQL> with tmp as
  2  (select rownum rn, sum(cnt) over(order by rownum) path_cnt, path, cnt
  3      from (select sys_connect_by_path(filmname, ',') path, level cnt
  4               from t_film
  5              where connect_by_isleaf = 1
  6              start with substr(filmname, -1) = 'a'
  7                      or instr('abc', substr(filmname, -1)) = 0
  8             connect by length(filmname) = length(prior filmname)
  9                    and instr('abc', substr(filmname, -1)) > 0
10                    and instr('abc', substr(prior filmname, -1)) > 0
11                    and substr(filmname, 1, length(filmname) - 1) =
12                        substr(prior filmname, 1, length(prior filmname) - 1)
13                    and filmname > prior filmname
14              order by dbms_random.value)
15    )
16  select substr(replace(a.path, '|') || b.path, 2) filnmaes
17    from (select path_cnt, sys_connect_by_path(path, '|') path
18             from tmp
19            where connect_by_isleaf = 1
20            start with rn = 1
21           connect by rn = prior rn + 1
22                  and path_cnt < 8) a, tmp b
23  where a.path_cnt + b.cnt = 8
24     and a.path_cnt < b.path_cnt
25     and rownum = 1;

未选定行

SQL> ed
已写入 file afiedt.buf

  1  with tmp as
  2  (select rownum rn, sum(cnt) over(order by rownum) path_cnt, path, cnt
  3      from (select sys_connect_by_path(filmname, ',') path, level cnt
  4               from t_film
  5              where connect_by_isleaf = 1
  6              start with substr(filmname, -1) = 'a'
  7                      or instr('abc', substr(filmname, -1)) = 0
  8             connect by length(filmname) = length(prior filmname)
  9                    and instr('abc', substr(filmname, -1)) > 0
10                    and instr('abc', substr(prior filmname, -1)) > 0
11                    and substr(filmname, 1, length(filmname) - 1) =
12                        substr(prior filmname, 1, length(prior filmname) - 1)
13                    and filmname > prior filmname
14              order by dbms_random.value)
15    )
16  select substr(replace(a.path, '|') || b.path, 2) filnmaes
17    from (select path_cnt, sys_connect_by_path(path, '|') path
18             from tmp
19            where connect_by_isleaf = 1
20      --      start with rn = 1
21           connect by rn = prior rn + 1
22                  and path_cnt < 8) a, tmp b
23  where a.path_cnt + b.cnt = 8
24     and a.path_cnt < b.path_cnt
25*    and rownum = 1
SQL> /

FILNMAES
--------------------------------------------------------------------------------
别拿自己不当干部,三分钟先生,彩票也疯狂,嬉戏江湖,侏罗纪公园i,冰河世纪2a,冰河世纪2
b,神枪手智多星


SQL>

使用道具 举报

回复
论坛徽章:
4
奥运会纪念徽章:柔道
日期:2008-07-04 17:49:032009新春纪念徽章
日期:2009-01-04 14:52:282010新春纪念徽章
日期:2010-03-01 11:08:27
18#
发表于 2008-7-3 17:14 | 只看该作者
我的数据库是9i,只测试16楼三思老大的sql可以

使用道具 举报

回复
论坛徽章:
85
2008新春纪念徽章
日期:2008-02-13 12:43:03双黄蛋
日期:2011-06-17 11:07:502011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-04 10:24:022010年世界杯参赛球队:荷兰
日期:2010-08-28 00:09:112010年世界杯参赛球队:科特迪瓦
日期:2010-03-02 12:36:542010新春纪念徽章
日期:2010-03-01 11:07:242010新春纪念徽章
日期:2010-03-01 11:07:242010新春纪念徽章
日期:2010-01-04 08:33:082010年世界杯参赛球队:意大利
日期:2009-12-31 14:41:24
19#
发表于 2008-7-3 17:35 | 只看该作者
原帖由 junsansi 于 2008-7-3 16:17 发表
有点儿意思,看看俺的
[php]
SQL> select * from t_film;

FILMNAME
--------------------------------------------------
爱国者
爱情呼叫转移
宝贝计划
别拿自己不当干部
别惹小孩
冰河世纪2b
冰河世纪2a
彩票也疯狂
东方海盗传奇a
东方海盗传奇b
飞行者
侏罗纪公园iii
侏罗纪公园ii
侏罗纪公园i
音乐
兄弟
戏王之王
嬉戏江湖
屠龙传奇
天行者a
天行者b
太极张三丰a
太极张三丰b
太极a
太极b
双龙记
神枪手智多星
三分钟先生
忍者兵b
忍者兵a
奇迹b
奇迹a
破敌

33 rows selected

SQL>
SQL> with tt as(
  2  select filmname ofm,
  3         rtrim(filmname, 'abi') nfm,
  4         count(rtrim(filmname, 'abi')) over(partition by rtrim(filmname, 'abi')) ct,
  5         row_number() over(partition by rtrim(filmname, 'abi') order by 1) rn
  6    from t_film t
  7  )
  8  select ofm
  9    from tt
10   where nfm in (select nfm
11                   from (select a.*, sum(ct) over(order by rownum) sv
12                           from tt a
13                          where rn = 1
14                          order by dbms_random.value)
15                  where sv  
--
[/php]


这个语句有点问题啊,一部电影不一定就只有AB 有可能是ABC的哦,如果这样的话就不一定对了

[ 本帖最后由 shiguibao 于 2008-7-3 17:46 编辑 ]

使用道具 举报

回复
论坛徽章:
0
20#
发表于 2008-7-3 17:36 | 只看该作者
豪强

使用道具 举报

回复

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

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表