我在分组某些数据集时遇到了一些麻烦。这是我的查询和查询结果。
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))
答案 0 :(得分:1)
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()
将日期时间/时间戳列添加到特定形状中。 在您的情况下,我们使用
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
的自定义组中。
答案 1 :(得分:0)
您需要在选择中创建列,然后您可以按此列进行分组。这是一个例子:
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