如何对每 2 个元素的列列表进行分组

问题描述 投票:0回答:1

我正在请求按升序排列的

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 |
+---------------------------------------------------+

或者甚至更好,

TIMEDIFF()
date1 和 date2 的结果在一行,date3 和 date4 在另一行,依此类推...

由于我可以有很多行,因此我使用 modulo 2 和 co 寻找解决方案,但没有成功使其工作。

mariadb grouping
1个回答
0
投票

通常您有一些关于哪些行属于一起的信息。但如果你只想依赖列,你可以这样做:

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 订购

© www.soinside.com 2019 - 2024. All rights reserved.