楼主: newkid

[精华] 发现一位专门用SQL解各种谜题的高人!

[复制链接]
论坛徽章:
33
劳斯莱斯
日期:2013-08-08 14:01:23三菱
日期:2013-09-28 10:16:06一汽
日期:2013-11-19 17:01:11凯迪拉克
日期:2013-12-07 17:11:282014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02itpub13周年纪念徽章
日期:2014-09-27 14:20:21itpub13周年纪念徽章
日期:2014-10-08 15:13:38懒羊羊
日期:2015-03-04 14:52:112015年新春福章
日期:2015-03-06 11:58:18
71#
发表于 2010-7-23 16:50 | 只看该作者
感觉00的数学很强。

使用道具 举报

回复
论坛徽章:
8
数据库板块每日发贴之星
日期:2009-06-12 01:01:02数据库板块每日发贴之星
日期:2009-06-21 01:01:01ITPUB9周年纪念徽章
日期:2010-10-08 09:32:272010广州亚运会纪念徽章:游泳
日期:2010-11-12 16:42:092011新春纪念徽章
日期:2011-02-18 11:42:502010广州亚运会纪念徽章:三项全能
日期:2011-02-26 13:07:50咸鸭蛋
日期:2011-08-30 15:51:05ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22
72#
发表于 2010-7-25 21:35 | 只看该作者
高人啊 经典!

使用道具 举报

回复
论坛徽章:
10
生肖徽章2007版:蛇
日期:2008-10-16 15:37:262011新春纪念徽章
日期:2011-02-18 11:43:35祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:蛇
日期:2009-04-23 10:20:26生肖徽章2007版:鸡
日期:2009-03-10 21:16:44数据库板块每日发贴之星
日期:2009-01-08 01:01:022009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:蛇
日期:2008-10-27 16:26:10奥运会纪念徽章:举重
日期:2008-10-24 13:16:31一汽
日期:2013-10-28 20:43:00
73#
发表于 2010-7-29 09:10 | 只看该作者
newkid How to find the Longest Common Subsequence (LCS) in SQL这个方案你给出了with递归检查
但是在我的ORA11GR2环境跑的时候出现ORA-01489错误 你是怎么决绝的??

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
74#
 楼主| 发表于 2010-7-29 23:37 | 只看该作者
原帖由 gkl0818 于 2010-7-29 09:10 发表
newkid How to find the Longest Common Subsequence (LCS) in SQL这个方案你给出了with递归检查
但是在我的ORA11GR2环境跑的时候出现ORA-01489错误 你是怎么决绝的??


用递归拼接出来的列有时候会出这个错,你可以加个CAST函数,告诉ORACLE这个列有多宽:

WITH d AS (
    SELECT dt.*,COUNT(DISTINCT id) OVER(PARTITION BY grp_id,c) cnt_c
      FROM (SELECT dt.*,SUBSTR(in_str,rn,1) c,rn
              FROM (SELECT data.*,COUNT(*) OVER (PARTITION BY grp_id) cnt FROM data) dt
                  ,(SELECT ROWNUM rn FROM (SELECT MAX(LENGTH(in_str)) len FROM data) CONNECT BY ROWNUM<=len)
             WHERE rn<=LENGTH(in_str)
            ) dt
)
,t(id,grp_id,in_str,rn,w,cnt) AS (
    SELECT id,grp_id,in_str,rn,CAST(c AS VARCHAR2(1000)),cnt FROM d
    UNION ALL
    SELECT d.id,d.grp_id,d.in_str,d.rn,t.w||d.c,t.cnt
      FROM t,d
     WHERE t.id = d.id AND t.rn<d.rn
)
SELECT grp_id,w
  FROM (SELECT grp_id,w,rank() OVER(PARTITION BY grp_id ORDER BY LENGTH(w) DESC) rnk
         FROM t
         GROUP BY grp_id,w
         HAVING COUNT(DISTINCT id) = MAX(cnt)
        )
WHERE rnk=1
;

使用道具 举报

回复
论坛徽章:
10
生肖徽章2007版:蛇
日期:2008-10-16 15:37:262011新春纪念徽章
日期:2011-02-18 11:43:35祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:蛇
日期:2009-04-23 10:20:26生肖徽章2007版:鸡
日期:2009-03-10 21:16:44数据库板块每日发贴之星
日期:2009-01-08 01:01:022009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:蛇
日期:2008-10-27 16:26:10奥运会纪念徽章:举重
日期:2008-10-24 13:16:31一汽
日期:2013-10-28 20:43:00
75#
发表于 2010-7-30 09:07 | 只看该作者
OK 谢谢 已经解决

使用道具 举报

回复
论坛徽章:
18
ERP板块每日发贴之星
日期:2010-08-15 01:01:02喜羊羊
日期:2015-03-16 11:00:26喜羊羊
日期:2015-03-10 14:01:43知识
日期:2015-03-10 11:54:022015年新春福章
日期:2015-03-06 11:57:31暖羊羊
日期:2015-03-04 14:50:37ITPUB社区12周年站庆徽章
日期:2013-08-20 11:30:112013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-01-07 13:17:49ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
76#
发表于 2010-7-31 21:44 | 只看该作者
我看了下网站,确实了得

使用道具 举报

回复
论坛徽章:
27
2009日食纪念
日期:2009-07-22 09:30:002010广州亚运会纪念徽章:保龄球
日期:2010-11-29 11:17:362010广州亚运会纪念徽章:橄榄球
日期:2010-11-29 11:24:212010广州亚运会纪念徽章:网球
日期:2010-11-29 11:26:562010广州亚运会纪念徽章:摔跤
日期:2010-11-29 11:27:442011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB十周年纪念徽章
日期:2011-11-01 16:24:51鲜花蛋
日期:2011-12-14 16:07:452012新春纪念徽章
日期:2012-01-04 11:54:46迷宫蛋
日期:2012-01-17 10:20:51
77#
发表于 2010-8-6 10:56 | 只看该作者
牛人啊

使用道具 举报

回复
论坛徽章:
1
2010新春纪念徽章
日期:2010-03-01 11:19:52
78#
发表于 2010-8-10 17:23 | 只看该作者
不错,高手

使用道具 举报

回复
论坛徽章:
4
奥运会纪念徽章:蹦床
日期:2012-08-31 15:50:20ITPUB 11周年纪念徽章
日期:2012-10-09 18:07:31
79#
发表于 2012-8-1 18:15 | 只看该作者
这种帖子,值得一看

使用道具 举报

回复
论坛徽章:
95
生肖徽章2007版:牛
日期:2012-08-02 22:43:00紫蛋头
日期:2012-12-08 09:43:38鲜花蛋
日期:2012-11-17 12:02:07鲜花蛋
日期:2013-02-05 21:53:34复活蛋
日期:2012-11-17 12:02:07SQL极客
日期:2013-12-09 14:13:35SQL数据库编程大师
日期:2013-12-06 13:59:43SQL大赛参与纪念
日期:2013-12-06 14:10:50ITPUB季度 技术新星
日期:2012-11-27 10:16:10最佳人气徽章
日期:2013-03-19 17:24:25
80#
发表于 2012-8-1 22:11 | 只看该作者
其实进行更好的数学建模是第一步,比如1楼时候的exchange 1 dollar题目,所谓的最直接了当的做法,把1分硬币的表加入了笛卡尔积,是十分不明智的,这才是导致where之前结果集异常庞大的根源。
实际上,只需要
  1. select        *
  2. from        (
  3.         select        *
  4.         from        (select rownum-1 id5 from dual connect by level<=21),
  5.                 (select rownum-1 id10 from dual connect by level<=11),
  6.                 (select rownum-1 id25 from dual connect by level<=5),
  7.                 (select rownum-1 id50 from dual connect by level<=3)
  8.         )
  9. where        id5*5+id10*10+id25*25+id50*50<=100;
复制代码
这样我觉得就不需要再考虑其他方法了

使用道具 举报

回复

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

本版积分规则 发表回复

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