时间段SQL查询

时间:2012-12-06 23:47:34

标签: mysql sql aggregation

我有一张这样的表:

---------------------------------------------
|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中有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

您应该使用datetime or timestamp代替time来跨日期边界进行此项工作。见评论。

大多数RDBMS的标准SQL

为此使用窗口功能。现在在大多数着名的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。

的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 with both queries.

关于TIMESTAMPDIFF()TIMEPDIFF()

的手册

如果您的Id列无间隙升序,则会更简单。但现实生活中的情况很少见。