mysql 分段id,MySQL:按照ID分组日期时间求和,过滤重叠时间

MySQL:按照ID分组日期时间求和,过滤重叠时间

xmh

2021年03月05日 pm20:23

数据库技术,

MySQL,

阅读 48

原始数据

SELECT d.waybill_no,

@group_row:=CASE WHEN @parent_code=picked_by THEN @group_row+1 ELSE 1 END AS id,

@parent_code1:=picked_by AS picked_by1,

MIN(spd.picked_date) start_time,

MAX(spd.picked_date) end_time,

TIMESTAMPDIFF(HOUR,MIN(spd.picked_date),MAX(spd.picked_date)) times,

spd.picked_by

FROM `shipping_order` d

LEFT JOIN shipping_pick_detail spd

ON d.`SHIPPING_ORDER_ID`=spd.SHIPPING_ORDER_ID

GROUP BY spd.picked_by,d.waybill_no

如图:

5d75474dc0d1c853f05986ddfdf632a4.png

原始需要求和数据

添加分组行号:

SELECT

start_time,

end_time,

picked_by,

@group_row:=CASE WHEN @parent_code=picked_by THEN @group_row+1 ELSE 1 END AS id,

@parent_code:=picked_by AS parent_code

FROM (

SELECT d.waybill_no,

@group_row:=CASE WHEN @parent_code=picked_by THEN @group_row+1 ELSE 1 END AS id,

@parent_code1:=picked_by AS picked_by1,

MIN(spd.picked_date) start_time,

MAX(spd.picked_date) end_time,

TIMESTAMPDIFF(HOUR,MIN(spd.picked_date),MAX(spd.picked_date)) times,

spd.picked_by

FROM `shipping_order` d

LEFT JOIN shipping_pick_detail spd

ON d.`SHIPPING_ORDER_ID`=spd.SHIPPING_ORDER_ID

GROUP BY spd.picked_by,d.waybill_no) iop

LEFT JOIN ( SELECT @group_row:=1, @parent_code:='',@parent_code1:='' ) b

ON 1=1

ORDER BY picked_by

7fde46fd73916993a1f01712e4ffa9df.png

添加分组行号结果

分组汇总效果

SELECT

picked_by,

SUM(t.duration) - SUM(t.overlap) AS filtered_duration

FROM

(

SELECT

t1.picked_by,

t1.start_time,

t1.end_time,

TIMESTAMPDIFF(HOUR,t1.start_time,t1.end_time) AS duration,

SUM(

IF(t2.start_time < t1.start_time AND t2.end_time > t1.end_time , TIMESTAMPDIFF(HOUR,t1.start_time,t1.end_time), 0) -- t2 completely around t1

+ IF(t2.start_time >= t1.start_time AND t2.end_time <= t1.end_time , TIMESTAMPDIFF(HOUR,t2.start_time,t2.end_time), 0) -- t2 completely within t1

+ IF(t2.start_time < t1.start_time AND t2.end_time > t1.start_time AND t2.end_time < t1.end_time , TIMESTAMPDIFF(HOUR,t1.start_time,t2.end_time), 0) -- t2 starts before t1 starts and overlaps partially

+ IF(t2.start_time < t1.end_time AND t2.end_time > t1.end_time AND t2.start_time > t1.start_time, TIMESTAMPDIFF(HOUR,t2.start_time,t1.end_time), 0) -- t2 starts before t1 ends and overlaps partially

) AS overlap

FROM

( SELECT

start_time,

end_time,

picked_by,

@group_row:=CASE WHEN @parent_code=picked_by THEN @group_row+1 ELSE 1 END AS id,

@parent_code:=picked_by AS parent_code

FROM (

SELECT d.waybill_no,

@group_row:=CASE WHEN @parent_code=picked_by THEN @group_row+1 ELSE 1 END AS id,

@parent_code1:=picked_by AS picked_by1,

MIN(spd.picked_date) start_time,

MAX(spd.picked_date) end_time,

TIMESTAMPDIFF(HOUR,MIN(spd.picked_date),MAX(spd.picked_date)) times,

spd.picked_by

FROM `shipping_order` d

LEFT JOIN shipping_pick_detail spd

ON d.`SHIPPING_ORDER_ID`=spd.SHIPPING_ORDER_ID

GROUP BY spd.picked_by,d.waybill_no) iop

LEFT JOIN ( SELECT @group_row:=1, @parent_code:='',@parent_code1:='' ) b

ON 1=1

ORDER BY picked_by ) t1

LEFT JOIN ( SELECT

start_time,

end_time,

picked_by,

@group_row:=CASE WHEN @parent_code=picked_by THEN @group_row+1 ELSE 1 END AS id,

@parent_code:=picked_by AS parent_code

FROM (

SELECT d.waybill_no,

@group_row:=CASE WHEN @parent_code=picked_by THEN @group_row+1 ELSE 1 END AS id,

@parent_code1:=picked_by AS picked_by1,

MIN(spd.picked_date) start_time,

MAX(spd.picked_date) end_time,

TIMESTAMPDIFF(HOUR,MIN(spd.picked_date),MAX(spd.picked_date)) times,

spd.picked_by

FROM `shipping_order` d

LEFT JOIN shipping_pick_detail spd

ON d.`SHIPPING_ORDER_ID`=spd.SHIPPING_ORDER_ID

GROUP BY spd.picked_by,d.waybill_no) iop

LEFT JOIN ( SELECT @group_row:=1, @parent_code:='',@parent_code1:='' ) b

ON 1=1

ORDER BY picked_by ) t2

ON t1.picked_by=t2.picked_by

AND t2.id > t1.id

AND (

(t2.start_time < t1.start_time AND t2.end_time > t1.end_time )

OR (t2.start_time >= t1.start_time AND t2.end_time <= t1.end_time )

OR (t2.start_time < t1.start_time AND t2.end_time > t1.start_time)

OR (t2.start_time < t1.end_time AND t2.end_time > t1.end_time )

)

GROUP BY

t1.start_time,

t1.end_time,t1.picked_by

) AS t

GROUP BY picked_by

eb220e3939c38d0f1c384a28a263547d.png

已经过滤重复时间段

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值