问题描述
我需要增加时间,但要减去状态为“停止”时的时间。我可以进行SQL查询还是需要结合使用SQL + PHP?我得到了这样的数据库。状态可以重演
MariaDB 10.5.11,
PHP 7.4.5
ID Date Status
1 2020.11.02 15:00 New
1 2020.11.02 15:00 New_Step
1 2020.11.02 15:05 Start
1 2020.11.02 15:05 Stop
1 2020.11.02 15:10 Start
1 2020.11.02 15:15 Transferred
1 2020.11.02 15:20 Stop
1 2020.11.02 16:25 End
2 2020.11.02 16:00 New
2 2020.11.02 16:00 Start
2 2020.11.02 16:05 Stop
2 2020.11.02 16:10 Start
2 2020.11.02 16:15 Stop
2 2020.11.02 16:20 Start
2 2020.11.02 16:25 New_Step
3 2020.11.02 16:30 Transferred
2 2020.11.02 16:35 End
我需要得到这个结果
ID SumTime
1 15 min
2 25 min
我需要在此查询中添加新状态“ Transferred and New_Step”
SELECT t1.ID,SUM(TIMESTAMPDIFF(MINUTE,t1.`Date`,t2.`Date`)) complsum
FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY `ID` ORDER BY `Date` ASC) AS row_num
FROM table1 WHERE `Status` = 'Start') t1
INNER JOIN (SELECT *,ROW_NUMBER() OVER (PARTITION BY `ID` ORDER BY `Date` ASC) AS row_num
FROM table1 WHERE `Status` IN ('Stop','End')) t2
ON t1.ID = t2.ID AND t1.`row_num` = t2.`row_num`
GROUP BY t1.ID
解决方法
您要计算起始状态不是“停止”的所有间隔。您可以只使用lead()
和日期算术:
select id,sum(timestampdiff(minute,date,lead_date)) sumtime
from (
select t.*,lead(date) over(partition by id order by date) lead_date
from mytable t
) t
where status <> 'Stop'
group by id
请注意,要使此操作始终如一,您需要每个date
都是唯一的-否则,对于重复项,未定义的事件顺序必须是唯一的-或者至少,您需要其他条件来打破日期关系,例如自动递增的主键。
这里是一个 demo on DB Fiddle ,它向子查询的order by
添加了主键,演示了查询的工作方式。
我不了解逻辑,但也许您需要
WITH cte AS (SELECT ID,`Date`
FROM test
GROUP BY ID,`Date`
-- remove timepoint where status is 'Stop' for at least one row
HAVING !SUM(Status = 'Stop'))
SELECT ID,-- Calculate points amount and multiply by 5,adjust points to ranges between points
CONCAT(5 * COUNT(`Date`) - 5,' min')
FROM cte
GROUP BY id;
?