我正在请求按升序排列的
DATETIME(3)
列表,例如:
> SELECT occurred_at FROM events ORDER BY ASC;
+-------------------------+
| occurred_at |
+-------------------------+
| 2023-11-07 10:21:34.517 |
| 2023-11-07 10:20:34.524 |
| 2023-11-07 10:19:34.514 |
| 2023-11-07 10:18:34.517 |
| 2023-11-07 10:17:34.512 |
| 2023-11-07 10:16:34.517 |
| 2023-11-07 10:15:34.518 |
| 2023-11-07 10:14:34.515 |
+-------------------------+
这个请求非常简单,但我想测量每两个日期之间的时间(含义是比较连续第一个结果和第二个结果之间的经过时间,然后是另一个结果中的第三个和第四个结果之间的经过时间,等等......没有将第二个与第三个、第四个与第五个进行比较,等等……)。 原生
TIMEDIFF(date1, date2)
函数可以帮助我实现这个目标,但由于我的目标是将它们分组(也许使用 GROUP_CONCAT()
?)两个,我想要一个如下所示的列表:
> THE_QUERY;
+---------------------------------------------------+
| occurred_at |
+---------------------------------------------------+
| 2023-11-07 10:21:34.517, 2023-11-07 10:20:34.524 |
| 2023-11-07 10:19:34.514, 2023-11-07 10:18:34.517 |
| 2023-11-07 10:17:34.512, 2023-11-07 10:16:34.517 |
| 2023-11-07 10:15:34.518, 2023-11-07 10:14:34.515 |
+---------------------------------------------------+
或者甚至更好,
date1 和 date2 的结果在一行,date3 和 date4 在另一行,依此类推...TIMEDIFF()
由于我可以有很多行,因此我使用 modulo 2 和 co 寻找解决方案,但没有成功使其工作。
通常您有一些关于哪些行属于一起的信息。但如果你只想依赖列,你可以这样做:
select min(occurred_at), max(occurred_at), timediff(max(occurred_at), min(occurred_at))
from (
select occurred_at, cast((row_number() over (order by occurred_at))/2 as unsigned) as rn
from events
) as q
group by rn desc
order by 1
查看dbfiddle 按 rn 描述分组 按 1 订购