我有一张这样的表:
---------------------------------------------
|Id | Step | StartedAt |
---------------------------------------------
| 1 | Download Data | 10:20:00 |
| 2 | Data Quality Control | 10:45:00 |
| 3 | Run Prediction | 10:47:00 |
---------------------------------------------
什么是SQL查询告诉我每个步骤的时间如下:“下载数据”花了25分钟,“数据质量控制”花了2分钟等。
干杯。
P.S我的RDBMS是MySQL。在MySQL中有没有办法做到这一点?
答案 0 :(得分:0)
您应该使用datetime
or timestamp
代替time
来跨日期边界进行此项工作。见评论。
为此使用窗口功能。现在在大多数着名的RDBMS(MySQL除外)中实现:
SELECT *
,lead("StartedAt") OVER (ORDER BY "StartedAt") - "StartedAt" AS duration
FROM tbl;
lead()
根据ORDER BY
子句中的顺序检索 next 行的值。对于最后一行,如果没有“下一行”,则会获得NULL
。
我引用manual of PostgreSQL on window functions,因为你没有命名你的RDBMS。
在没有窗口函数的情况下,一种方法是使用相关子查询:
SELECT t1.*
,(SELECT t2."StartedAt"
FROM tbl t2
WHERE t2.id > t1.id
ORDER BY t2."StartedAt"
LIMIT 1) - "StartedAt" AS duration
FROM tbl t1;
或者这可能更快:
SELECT t1."Id", t1."Step", t1."StartedAt"
,TIMESTAMPDIFF(MINUTE, t1."StartedAt", min(t2."StartedAt")) AS minutes
FROM tbl t1
LEFT JOIN tbl t2 ON t2."Id" > t1."Id"
GROUP BY t1."Id", t1."Step", t1."StartedAt";
->sqlfiddle with both queries.
的手册如果您的Id
列无间隙升序,则会更简单。但现实生活中的情况很少见。