繁体   English   中英

时间段SQL查询

[英]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中做到这一点?

您应该使用datetimetimestamp而不是time来跨日期边界进行此项工作。 看评论。

大多数RDBMS的标准SQL

为此使用窗口功能 到目前为止,已在最著名的RDBMS(MySQL除外)中实现:

SELECT *
     ,lead("StartedAt") OVER (ORDER BY "StartedAt") - "StartedAt" AS duration
FROM  tbl;

lead()根据ORDER BY子句中的顺序检索下一行的值。 对于没有“下一行”的最后一行,您将获得NULL

我引用了有关窗口函数的PostgreSQL手册 ,因为您没有命名RDBMS。

的MySQL

在没有窗口函数的情况下,一种方法是使用相关子查询:

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与两个查询。

有关TIMESTAMPDIFF()TIMEPDIFF()的手册

如果您的Id栏可以无间隙地递增,那么会更简单。 但这在现实生活中很少见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM