簡體   English   中英

MySQL GROUP BY 按天查詢組結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM