求助,对不连续的时间数据统计,查询出多段闭合时间段的合计数据

loneliness9 2018-12-29 04:33:54
要求在oracle数据库中求一段日期内送餐公司送了多少份餐,数据库中记录的是送餐日期,送餐公司名,送餐份数。其中送餐日期可能不连续,要求查询出来的结果根据间断的时间分段显示,即,
送餐起始日期,送餐结束日期,送餐公司,份数。
数据库中字段,例:
日期 公司 份数
2018-12-01 A 15
2018-12-01 B 20
2018-12-02 A 18
2018-12-02 C 27
2018-12-03 A 31
2018-12-03 B 21
2018-12-03 C 15
2018-12-04 B 20

要求统计结果
开始时间 结束时间 公司 总份数
2018-12-01 2018-12-03 A 63
2018-12-01 2018-12-01 B 20
2018-12-03 2018-12-04 B 41
2018-12-02 2018-12-03 C 42
...全文
395 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
loneliness9 2019-01-03
  • 打赏
  • 举报
回复
谢谢,研究了两天,终于套进去了。非常感谢,嗯,我继续研究是咋个原理去。谢谢了。
nayi_224 2018-12-29
  • 打赏
  • 举报
回复
with tab1 as (
select to_date('20181201', 'yyyymmdd') dt, 'a' id, 1 num from dual union all
select to_date('20181202', 'yyyymmdd') dt, 'a' id, 1 num from dual union all
select to_date('20181203', 'yyyymmdd') dt, 'a' id, 1 num from dual union all
select to_date('20181201', 'yyyymmdd') dt, 'b' id, 1 num from dual union all
select to_date('20181203', 'yyyymmdd') dt, 'b' id, 1 num from dual union all
select to_date('20181204', 'yyyymmdd') dt, 'b' id, 1 num from dual 
)
, tab2 as (
select t1.*,
       decode(t1.dt - 1, lag(t1.dt) over(partition by t1.id order by t1.dt), 0, 1) lg
  from tab1 t1
)
, tab3 as (
select t1.*,
       sum(t1.lg) over(partition by t1.id order by t1.dt) group_id
  from tab2 t1
)
select t1.id,
       t1.group_id,
       min(t1.dt),
       max(t1.dt),
       sum(num)
  from tab3 t1
 group by t1.id, t1.group_id
 order by t1.id, t1.group_id
;

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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