[英]MySQL GROUP BY query group results by day
我有一個名為“counter”的表,它有 3 個字段:
| Field | Type | Null | Key | Default | Extra |
+--------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| record | datetime | YES | | NULL | |
| passed | tinyint(1) | YES | | NULL | |
+--------+------------+------+-----+---------+----------------+
我存儲的數據是這樣的
mysql> SELECT record, passed FROM counter;
+---------------------+--------+
| record | passed |
+---------------------+--------+
| 2019-09-19 00:00:00 | 1 |
我想要做的是查詢以獲取特定日期的結果。
我使用了該查詢:
SELECT DATE_FORMAT(record, '%d-%m-%Y %H') AS ts,
COUNT(*) AS passed
FROM counter
GROUP BY ts
HAVING ts = 09;
問題是如果數據庫上有幾個月,它將返回每個月的第 09 天。
+---------------+--------+
| ts | passed |
+---------------+--------+
| 09-10-2019 10 | 593 |
| 09-10-2019 11 | 667 |
| 09-10-2019 12 | 367 |
| 09-10-2019 13 | 35 |
+---------------+--------+
我想得到一個確切的日期,我試圖輸入確切的日期
SELECT DATE_FORMAT(record, '%d-%m-%Y %H') AS ts,
COUNT(*) AS passed
FROM counter
WHERE 09-10-2019;
但我得到一個錯誤
錯誤 1140 (42000):在沒有 GROUP BY 的聚合查詢中,SELECT 列表的表達式 #1 包含非聚合列“iot.counter.record”; 這與 sql_mode=only_full_group_by 不兼容
我該如何解決這個問題?
問題是您在日期格式中包含了小時,這意味着每天將有多達 24 個子組......一天中的每個小時一個。 刪除%H
並修復WHERE
子句:
SELECT DATE_FORMAT(record, '%d-%m-%Y') AS ts, COUNT(*)
FROM counter
WHERE record >= '2019-10-09'
AND record < '2019-10-09' + INTERVAL 1 DAY
GROUP BY DATE_FORMAT(record, '%d-%m-%Y')
如果您只想獲取當前日期第 9 小時的數據,那么您實際上不需要考慮一整天的數據,然后使用 having 子句進行聚合和過濾。 由於增加的數據樹查找以及增加的臨時表大小(最終被丟棄),這不必要地低效。
相反,您可以只使用WHERE
子句來過濾掉數據並計數:
SELECT COUNT(*)
FROM counter
WHERE record >= '2019-10-09 09:00:00'
AND record < '2019-10-09 10:00:00'
上面的查詢將顯着受益於(record)
列上的覆蓋索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.