12
返回列表 发新帖
楼主: 通垭口村的

请教各位一个算法问题

[复制链接]
论坛徽章:
1
秀才
日期:2017-04-05 13:27:59
11#
 楼主| 发表于 2017-3-29 23:35 | 只看该作者
newkid 发表于 2017-3-29 23:33
如果是合并连续区间的问题,这个论坛已经出现过很多次了,比如:
http://www.itpub.net/thread-1223937-1- ...

好的,谢谢版主,我去学习下。

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-04-05 13:27:59
12#
 楼主| 发表于 2017-3-30 07:25 | 只看该作者
newkid 发表于 2017-3-29 23:33
如果是合并连续区间的问题,这个论坛已经出现过很多次了,比如:
http://www.itpub.net/thread-1223937-1- ...

版主如果既有连续也有不连续的应该怎么实现呢?比如有6条数据,前3条连续,或者有交叉,中间断了,后3条连续或者有交叉,我想把他们合并成2条数据。

使用道具 举报

回复
论坛徽章:
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
13#
发表于 2017-3-30 08:46 来自手机 | 只看该作者
通垭口村的 发表于 2017-3-30 07:25
版主如果既有连续也有不连续的应该怎么实现呢?比如有6条数据,前3条连续,或者有交叉,中间断了,后3条 ...

http://www.itpub.net/forum.php?mod=viewthread&tid=1348543

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-04-05 13:27:59
14#
 楼主| 发表于 2017-3-30 08:57 | 只看该作者
newkid 发表于 2017-3-30 08:46
http://www.itpub.net/forum.php?mod=viewthread&tid=1348543

收到,谢谢

使用道具 举报

回复
论坛徽章:
18
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-12-12 09:52:44秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26
15#
发表于 2017-3-30 09:16 | 只看该作者
用蠢办法
WITH TMP(D,
DATA_DATE,
START_TIME,
END_TIME) AS
(SELECT '001', '20170329', '7:30', '8:30'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170329', '8:00', '9:30'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170329', '8:20', '8:40'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170329', '10:15', '11:20'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170329', '10:40', '12:50'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '7:40', '8:20'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '8:13', '9:14'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '8:20', '8:25'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '10:15', '11:20'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '10:40', '12:30'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '7:15', '8:20'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '8:13', '9:14'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '8:20', '8:40'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '10:15', '11:20'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '10:40', '12:10'
  FROM   DUAL)
SELECT D, DATA_DATE, COUNT(DISTINCT S + (T2.COLUMN_VALUE - 1) / 24 / 60)
FROM   (SELECT T.*,
                TO_DATE(DATA_DATE || ' ' || START_TIME, 'YYYY-MM-DD HH24:MI') AS S,
                TO_DATE(DATA_DATE || ' ' || END_TIME, 'YYYY-MM-DD HH24:MI') AS E
         FROM   TMP T) T1,
       TABLE(CAST(MULTISET (SELECT LEVEL
                    FROM   DUAL
                    CONNECT BY LEVEL <= (E - S) * 24 * 60) AS
                   SYS.ODCINUMBERLIST)) T2
GROUP  BY D, DATA_DATE

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-04-05 13:27:59
16#
 楼主| 发表于 2017-3-30 13:05 | 只看该作者
本帖最后由 通垭口村的 于 2017-3-30 13:06 编辑
chengccy2010 发表于 2017-3-30 09:16
用蠢办法
WITH TMP(D,
DATA_DATE,

你好 感谢你的回复,因为功力尚浅还在研究你的sql,现在公司需求有变,需要实现如下的效果,请教怎么实现呢:

id(公交车id)     data_date(运营时间)   hf_time (载客花费的时间,去除重复载客的时间)
001                      20170329                      155
001                      20170329                      120

001                      20170330                      94
001                      20170330                      135

002                      20170330                      119
002                      20170330                      115
也就是按空载时间把时间集合分层n个段,在分别计算各个段的花费时间。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
17#
发表于 2017-3-30 14:02 | 只看该作者

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-04-05 13:27:59
18#
 楼主| 发表于 2017-3-30 14:04 | 只看该作者
lastwinner 发表于 2017-3-30 14:02
请参考我的帖子  http://www.itpub.net/forum.php?mod=viewthread&amp;tid=719692&amp;extra=page%3D1%26filter%3Dt ...

好的,谢谢

使用道具 举报

回复
论坛徽章:
18
优秀写手
日期:2014-02-27 06:00:13秀才
日期:2017-12-12 09:52:44秀才
日期:2017-08-11 15:37:32弗兰奇
日期:2017-07-04 09:16:01秀才
日期:2017-06-29 10:16:48乌索普
日期:2017-05-26 08:58:24娜美
日期:2017-05-18 16:07:23ITPUB15周年纪念
日期:2017-05-02 15:22:36妮可·罗宾
日期:2017-04-06 10:06:19处女座
日期:2016-03-10 09:03:26
19#
发表于 2017-3-30 14:09 | 只看该作者
通垭口村的 发表于 2017-3-30 13:05
你好 感谢你的回复,因为功力尚浅还在研究你的sql,现在公司需求有变,需要实现如下的效果,请教怎么实现 ...

可以继续在我之前的SQL上加工, 也可以换另外一只, 先判断出连续的区间, 取出最大最小时间,计算耗时即可;
WITH TMP(D,
DATA_DATE,
START_TIME,
END_TIME) AS
(SELECT '001', '20170329', '7:30', '8:30'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170329', '8:00', '9:30'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170329', '8:20', '8:40'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170329', '10:15', '11:20'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170329', '10:40', '12:50'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '7:40', '8:20'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '8:13', '9:14'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '8:20', '8:25'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '10:15', '11:20'
  FROM   DUAL
  UNION ALL
  SELECT '001', '20170330', '10:40', '12:30'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '7:15', '8:20'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '8:13', '9:14'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '8:20', '8:40'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '10:15', '11:20'
  FROM   DUAL
  UNION ALL
  SELECT '002', '20170330', '10:40', '12:10'
  FROM   DUAL)
SELECT D, DATA_DATE, MIN(S) AS S, MAX(E) AS E,
       (MAX(E) - MIN(S)) * 24 * 60 AS HF_TIME
FROM   (SELECT D, DATA_DATE, S, E,
                SUM(FLAG) OVER(PARTITION BY D, DATA_DATE ORDER BY S) FLAG
         FROM   (SELECT D, DATA_DATE, S, E,
                         CASE
                            WHEN S <= LAG(E)
                             OVER(PARTITION BY D, DATA_DATE ORDER BY S) THEN
                             0
                            ELSE
                             1
                          END FLAG
                  FROM   (SELECT D, DATA_DATE,
                                  TO_DATE(DATA_DATE || ' ' || START_TIME,
                                           'YYYY-MM-DD HH24:MI') AS S,
                                  TO_DATE(DATA_DATE || ' ' || END_TIME,
                                           'YYYY-MM-DD HH24:MI') AS E
                           FROM   TMP)))
GROUP  BY D, DATA_DATE, FLAG
ORDER  BY D, DATA_DATE, S

使用道具 举报

回复
论坛徽章:
1
秀才
日期:2017-04-05 13:27:59
20#
 楼主| 发表于 2017-3-30 14:11 | 只看该作者
chengccy2010 发表于 2017-3-30 14:09
可以继续在我之前的SQL上加工, 也可以换另外一只, 先判断出连续的区间, 取出最大最小时间,计算耗时即可;
...

好的,谢谢

使用道具 举报

回复

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

本版积分规则 发表回复

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