Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中查询一系列连续事件_Mysql_Sql_Database_Group By - Fatal编程技术网

在MySQL中查询一系列连续事件

在MySQL中查询一系列连续事件,mysql,sql,database,group-by,Mysql,Sql,Database,Group By,我有一个带有项目和时间戳的事件表。我想查询所有连续项目系列。如果一个项目连续发生不止一次,则应多次列出该项目。我还想知道每个系列的开始和结束时间以及持续时间 示例: | project | created_at | |-----------|-------------------------| | project a | 2020-05-29 10:00:00.000 | | project a | 2020-05-29 10:00:01.167 | | proje

我有一个带有项目和时间戳的事件表。我想查询所有连续项目系列。如果一个项目连续发生不止一次,则应多次列出该项目。我还想知道每个系列的开始和结束时间以及持续时间

示例:

| project   | created_at              |
|-----------|-------------------------|
| project a | 2020-05-29 10:00:00.000 |
| project a | 2020-05-29 10:00:01.167 |
| project a | 2020-05-29 10:00:03.954 |
| project a | 2020-05-29 10:00:10.055 |
| project b | 2020-05-29 10:05:00.000 |
| project b | 2020-05-29 10:06:01.049 |
| project b | 2020-05-29 10:06:30.197 |
| project a | 2020-05-29 10:07:05.167 |
| project a | 2020-05-29 10:07:18.680 |
我希望收到以下输出:

| project   | start                   | end                     | duration     |
|-----------|-------------------------|-------------------------|--------------|
| project a | 2020-05-29 10:00:00.000 | 2020-05-29 10:00:10.055 | 00:00:10.055 |
| project b | 2020-05-29 10:05:00.000 | 2020-05-29 10:06:30.197 | 00:01:30:197 |
| project a | 2020-05-29 10:07:05.167 | 2020-05-29 10:07:18.680 | 00:00:13.513 |
| project   | start                   | end                     | duration     |
|-----------|-------------------------|-------------------------|--------------|
| project a | 2020-05-29 10:00:00.000 | 2020-05-29 10:07:18.680 | 00:07:18.680 |
| project b | 2020-05-29 10:05:00.000 | 2020-05-29 10:06:30.197 | 00:01:30:197 |
到目前为止,我有以下疑问:

SELECT 
project,
created_at AS "Start", 
Max(created_at) AS "End", 
TIMEDIFF(MAX(created_at), created_at) AS "Duration"
FROM results GROUP BY project;
这为我提供了以下输出:

| project   | start                   | end                     | duration     |
|-----------|-------------------------|-------------------------|--------------|
| project a | 2020-05-29 10:00:00.000 | 2020-05-29 10:00:10.055 | 00:00:10.055 |
| project b | 2020-05-29 10:05:00.000 | 2020-05-29 10:06:30.197 | 00:01:30:197 |
| project a | 2020-05-29 10:07:05.167 | 2020-05-29 10:07:18.680 | 00:00:13.513 |
| project   | start                   | end                     | duration     |
|-----------|-------------------------|-------------------------|--------------|
| project a | 2020-05-29 10:00:00.000 | 2020-05-29 10:07:18.680 | 00:07:18.680 |
| project b | 2020-05-29 10:05:00.000 | 2020-05-29 10:06:30.197 | 00:01:30:197 |
问题是我只能通过group by获得两个输出。这反过来又会弄乱要输出的开始和结束日期以及持续时间


有没有办法解决这个问题,以便我获得所需的输出?

这是一个缺口和孤岛问题的示例。行号的差异应满足您的要求:

SELECT project, MIN(created_at) as start_dt, max(created_at) as end_dt
       TIMEDIFF(MAX(created_at), created_at) AS Duration
FROM (SELECT r.*,
             ROW_NUMBER() OVER (PARTITION BY project ORDER BY created_at) as seqnum_p,
             ROW_NUMBER() OVER (ORDER BY created_at) as seqnum
      FROM results r
     ) r
GROUP BY project, (seqnum - seqnum_p)
ORDER BY MIN(created_at);

回答很好,假设MySQL 8+是这个版本。如果OP使用MySQL的早期版本,它应该考虑升级。