查看: 4499|回复: 18

[SQL] 【大话IT】急求一SQL写法。

[复制链接]
论坛徽章:
29
生肖徽章:猴
日期:2015-03-20 10:13:49ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:312015年新春福章
日期:2015-03-06 11:58:18优秀写手
日期:2015-03-07 06:00:14沸羊羊
日期:2015-03-13 13:26:07美羊羊
日期:2015-04-06 20:32:13天蝎座
日期:2015-07-20 12:34:47射手座
日期:2015-09-18 12:38:55乌索普
日期:2016-08-03 07:04:28奥运会纪念徽章:手球
日期:2016-09-26 07:19:26
发表于 2015-3-2 13:32 | 显示全部楼层 |阅读模式
ORACLE 10g

SELECT col_number FROM  t ORDER BY col_number;
col_number
1
2
3
4
7
8
10
13
14
要求结果如下,就是连续的数字放在一起,中断的则另起。
result_varchar
1-4
7-8
10
13-14


论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2015-3-2 13:54 | 显示全部楼层


如下:

SQL> with t as
  2  (
  3    select 1 col_number from dual
  4    union all
  5    select 2 col_number from dual
  6    union all
  7    select 3 col_number from dual
  8    union all
  9    select 4 col_number from dual
10    union all
11    select 7 col_number from dual
12    union all
13    select 8 col_number from dual
14    union all
15    select 10 col_number from dual
16    union all
17    select 13 col_number from dual
18    union all
19    select 14 col_number from dual
20  )
21  select  min(col_number) || '-' || max(col_number) result_varchar
22  from
23  (select col_number,
24          max(flag) over(order by col_number) flag
25  from
26  (select col_number,
27          case when col_number - lag(col_number) over(order by col_number) = 1 then 0 else row_number() over(order by col_number) end flag
28     from t))
29  group by flag
30  order by flag;

RESULT_VARCHAR
--------------------------------------------------------------------------------
1-4
7-8
10-10
13-14

SQL>



使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2015-3-2 13:56 | 显示全部楼层
号段选取啊,野花大湿的精华帖

使用道具 举报

回复
论坛徽章:
29
生肖徽章:猴
日期:2015-03-20 10:13:49ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:312015年新春福章
日期:2015-03-06 11:58:18优秀写手
日期:2015-03-07 06:00:14沸羊羊
日期:2015-03-13 13:26:07美羊羊
日期:2015-04-06 20:32:13天蝎座
日期:2015-07-20 12:34:47射手座
日期:2015-09-18 12:38:55乌索普
日期:2016-08-03 07:04:28奥运会纪念徽章:手球
日期:2016-09-26 07:19:26
 楼主| 发表于 2015-3-2 14:00 | 显示全部楼层
bell6248 发表于 2015-3-2 13:54
如下:

SQL> with t as

多谢大师的答复。

使用道具 举报

回复
论坛徽章:
29
生肖徽章:猴
日期:2015-03-20 10:13:49ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:312015年新春福章
日期:2015-03-06 11:58:18优秀写手
日期:2015-03-07 06:00:14沸羊羊
日期:2015-03-13 13:26:07美羊羊
日期:2015-04-06 20:32:13天蝎座
日期:2015-07-20 12:34:47射手座
日期:2015-09-18 12:38:55乌索普
日期:2016-08-03 07:04:28奥运会纪念徽章:手球
日期:2016-09-26 07:19:26
 楼主| 发表于 2015-3-2 14:02 | 显示全部楼层
oracle_cj 发表于 2015-3-2 13:56
号段选取啊,野花大湿的精华帖

恩,刚找到《剑破冰山》中的相关内容。

使用道具 举报

回复
认证徽章
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
发表于 2015-3-2 14:02 | 显示全部楼层
本帖最后由 bfc99 于 2015-3-3 09:04 编辑

WITH t AS (
SELECT 1 col_number FROM dual UNION ALL
SELECT 2 FROM dual UNION ALL
SELECT 3 FROM dual UNION ALL
SELECT 4 FROM dual UNION ALL
SELECT 7 FROM dual UNION ALL
SELECT 8 FROM dual UNION ALL
SELECT 10 FROM dual UNION ALL
SELECT 13 FROM dual UNION ALL
SELECT 14 FROM dual)
SELECT DISTINCT CASE WHEN min_value=max_value THEN to_char(max_value) ELSE min_value||'-'||max_value END RESULT
FROM (
SELECT t1.*,MIN(col_number) OVER(PARTITION BY col_number-rownum) min_value,MAX(col_number) OVER(PARTITION BY col_number-rownum) max_value
FROM (SELECT t.* FROM T ORDER BY col_number) t1
) t2;

使用道具 举报

回复
认证徽章
论坛徽章:
40
2014年新春福章
日期:2014-02-18 16:43:09喜羊羊
日期:2015-05-18 16:24:25慢羊羊
日期:2015-06-12 13:08:22暖羊羊
日期:2015-07-02 16:06:20暖羊羊
日期:2015-07-06 16:28:55狮子座
日期:2015-07-29 17:14:43摩羯座
日期:2015-09-02 13:58:47白羊座
日期:2015-09-08 10:39:06天枰座
日期:2015-09-17 21:41:53摩羯座
日期:2015-10-29 21:07:02
发表于 2015-3-2 14:03 | 显示全部楼层
bell6248 发表于 2015-3-2 13:54
如下:

SQL> with t as

速度啊!

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
认证徽章
论坛徽章:
6348
ITPUB9周年纪念徽章
日期:2014-05-02 10:36:402011新春纪念徽章
日期:2014-12-29 12:11:142010广州亚运会纪念徽章:卡巴迪
日期:2014-08-06 08:44:252012新春纪念徽章
日期:2014-12-29 12:11:142013年新春福章
日期:2014-12-29 12:11:14马上有车
日期:2014-12-29 12:11:14马上有房
日期:2014-12-29 12:11:14马上有钱
日期:2014-12-29 12:11:14马上有对象
日期:2014-12-29 12:11:14马上加薪
日期:2014-12-29 12:11:14
发表于 2015-3-2 14:10 | 显示全部楼层
老问题了~~

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2015-3-2 14:11 | 显示全部楼层
本帖最后由 oracle_cj 于 2015-3-2 14:17 编辑

SELECT MIN(COL_NUMBER) || '-' || MAX(COL_NUMBER)COL_NUMBER
  FROM (SELECT COL_NUMBER, COL_NUMBER - ROWNUM RN
          FROM T
        
         ORDER BY COL_NUMBER)
GROUP BY RN
ORDER BY RN

使用道具 举报

回复
认证徽章
论坛徽章:
0
发表于 2015-3-2 14:36 | 显示全部楼层
用LAG的正解,分析函数动态判断每一行的前后是否有超过1的步进,自动分开两行

使用道具 举报

回复

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

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时9.5折

【架构革新 高效可控】2020年8月17日~19日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


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