急求,跪求统计多个时间段不重复时间的天数

super-bo 2014-10-10 02:46:36
例如:
id 日期
1 2013.1.1-2013.3.1
1 2013.2.5-2013.4.2
1 2013.4.20-2014.5.12
1 2013.5.12-2014.5.21
1 2013.5.15-2014.7.7
2 2014.5.1-2014.5.24
2 2014.5.21-2014.7.8
2 2014.8.1-2014.8.8


统计出不同id的所属时间段内不重复的天数
跪求,解决了请吃饭
...全文
812 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2014-11-19
  • 打赏
  • 举报
回复
WITH t (id,S,E) AS (
--借用#1的拆分
)
,t1 AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY id ORDER BY S) rn
FROM t
)
,t2 AS (-- 用下一段的 S 剪切前一段的 E,去除重叠段落
SELECT ta.id,
ta.S,
CASE WHEN tb.S IS NULL THEN
ta.E
WHEN tb.S > ta.E THEN
ta.E
ELSE
tb.S-1
END E
FROM t1 ta
LEFT JOIN t1 tb
ON tb.id = ta.id
AND tb.rn = ta.rn+1
)
SELECT id,
SUM(E-S+1) days
FROM t2
GROUP BY id

上面求出的是去重后的天数(#2的10);如果要求重复就不计的天数(#2的8),就从t中统计出全部段落的天数、再减去这个去重后的天数。
doingendlessly 2014-11-18
  • 打赏
  • 举报
回复
不重复天数是指,重复的只算一次;还是只出现过一次的日期个数? 比如: 3 2014.8.1-2014.8.8 3 2014.8.7-2014.8.10 这个不重复天数是8,还是10?
bw555 2014-10-10
  • 打赏
  • 举报
回复
试一下吧
with T as (
select id,
TO_DATE(SUBSTR(日期,1,INSTR(日期,'-')-1),'YYYY.MM.DD') AS S,
TO_DATE(SUBSTR(日期,INSTR(日期,'-')+1),'YYYY.MM.DD') AS E
FROM T
)
SELECT ID,SUM(greatest(E-greatest(S,PRE+1)+1,0)) 天数
FROM
(SELECT ID,S,E,LAG(E,1,S-1)OVER(PARTITION BY ID ORDER BY E) PRE
FROM T)
GROUP BY ID
ORDER BY ID

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧