范围内的组日期时间
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
.
我在对一些数据集进行分组时遇到了一些麻烦。这是我的查询和查询结果。
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
.