查看: 3982|回复: 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的步进,自动分开两行

使用道具 举报

回复

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

本版积分规则 发表回复

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