范围内的组日期时间

Group datetime within range

我在对一些数据集进行分组时遇到了一些麻烦。这是我的查询和查询结果。

SELECT COUNT(*),salarie_id, created_at
FROM enregistrement 
GROUP BY salarie_id, created_at

我的观点是将相似的 created_at 行分组,间隔为 +/- 3 秒。我没有管理它,即使在 INTERVAL 这样的标准中使用 HAVING , WHERE ... BETWEEN.

我如何对这些行进行分组以获得例如我的计数结果中的 36 (33+3),如图所示?

未找到任何合适的解决方案...如果您需要更多信息,请告诉我。


更新 1:看起来@fancypants 解决方案是正确的。

SELECT COUNT(*),salarie_id, DATE_FORMAT(created_at, CONCAT('%Y-%m-%d %H:%i:', LEFT(RIGHT(created_at, 2), 1), RIGHT(created_at, 1) % 3)) AS 'date'
FROM enregistrement 
GROUP BY salarie_id, DATE_FORMAT(created_at, CONCAT('%Y-%m-%d %H:%i:', LEFT(RIGHT(created_at, 2), 1), RIGHT(created_at, 1) % 3))

您需要在 select 中创建列,然后您可以按此列进行分组。这是一个例子:

SELECT 
    COUNT(*),
    salarie_id, 
    IF(created_at BETWEEN "2014-10-01 00:00:00" AND "2014-10-01 00:00:00", "2014-10-01 00:00:00"
    ELSEIF(created_at BETWEEN "2015-02-18 11:05:43" AND "2015-02-18 11:05:46", "2015-02-18 11:05:43",
    ELSEIF( ...
    ))) as buckets
FROM enregistrement 
GROUP BY salarie_id, bucket

我不确定这对你的情况有多实用,因为你可能事先不知道间隔。

通过您的示例的一种简单方法是简单地按没有秒的日期和时间分组:

SELECT
  DATE_FORMAT(created_at,"%Y-%m-%d %H:%i") as short_date
  .....
GROUP BY salarie_id, short_date
SELECT COUNT(*),salarie_id, created_at
FROM enregistrement 
GROUP BY salarie_id, 
DATE_FORMAT(created_at, CONCAT('%Y-%m-%d %H:%i:', LEFT(RIGHT(created_at, 2), 1), 
CASE WHEN RIGHT(created_at, 1) BETWEEN 1 AND 4 THEN 0
WHEN RIGHT(created_at, 1) BETWEEN 5 AND 7 THEN 1
ELSE 2 END
));

您可以使用 DATE_FORMAT() 使您的 datetime/timestamp 栏变成特定的形状。 在您的情况下,我们指定格式

CONCAT('%Y-%m-%d %H:%i:', LEFT(RIGHT(created_at, 2), 1), RIGHT(created_at, 1) % 3))

也就是说,我们取年、月、日、时、分。然后我们将日期格式字符串与秒的十次方连接起来。

例如你有这个秒数:

21
33
36
40

然后我们用 LEFT(RIGHT(created_at, 2), 1) 取 2、3、3 和 4。我们用 RIGHT(created_at, 1) 得到的 1、3、6 和 0。然后你只需要将它们放入自定义组中 CASE WHEN.