[英]Time Period SQL Query
我有一张这样的桌子:
---------------------------------------------
|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分钟,依此类推。
干杯。
PS我的RDBMS是MySQL。 有什么办法可以在MySQL中做到这一点?
您应该使用datetime
或timestamp
而不是time
来跨日期边界进行此项工作。 看评论。
为此使用窗口功能 。 到目前为止,已在最著名的RDBMS(MySQL除外)中实现:
SELECT *
,lead("StartedAt") OVER (ORDER BY "StartedAt") - "StartedAt" AS duration
FROM tbl;
lead()
根据ORDER BY
子句中的顺序检索下一行的值。 对于没有“下一行”的最后一行,您将获得NULL
。
我引用了有关窗口函数的PostgreSQL手册 ,因为您没有命名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";
有关TIMESTAMPDIFF()
或TIMEPDIFF()
的手册
如果您的Id
栏可以无间隙地递增,那么会更简单。 但这在现实生活中很少见。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.