2015-05-12 43 views
0

我在分組某些數據集時遇到了一些麻煩。這是我的查詢和查詢結果。羣組datetime範圍內

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

我的觀點是將類似的created_at行,在+/- 3秒的時間間隔。我沒有管理它,甚至在使用INTERVAL時,在HAVINGWHERE ... 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)) 

回答

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 

然後我們需要2,3,3和4 LEFT(RIGHT(created_at, 2), 1)。我們用RIGHT(created_at, 1)得到的1,3,6和0。然後你只需要將它們放入CASE WHEN的自定義組中。

+0

更好地使用'DATE_FORMAT()'(在'select'子句中也是'group by'子句中的一樣,只是不想讓它看起來很雜亂 – fancyPants

+0

似乎我們得到了,但不是好結果呢,我更新了我的帖子,請看看,我需要將我選擇的2組進行分組,因爲他們在'created_at'字段中只有1秒的差異。 –

+1

對不起,模數的東西是錯誤的。咖啡更正了我的答案 – fancyPants

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