Mysql GROUP BY запрос.Показать данные по дате и часу - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть таблица с именем «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 |

ЧтоЯ хочу сделать это запрос, который суммирует, сколько раз переданное поле было 1 сгруппированы по часу и дате.например:

     Hour  | Date    |    passed
     13:00 2019-09-19      10

Выполнение:

SELECT HOUR (record), COUNT(*) as  passed FROM counter GROUP BY HOUR(record);

Я получаю эти результаты

| HOUR (record) | passed |
+---------------+--------+
|             0 |     67 |
|            13 |    199 |
+---------------+--------+

Проблема в том, что после 13:00 есть записи, а не высев навсе.

Также для того, чтобы получить также дату, которую я пытался:

SELECT DAY(record), COUNT(*), HOUR(record), COUNT(*) as  passed FROM counter GROUP BY HOUR(record);

И я получаю эту ошибку

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'iot.counter.record' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Как мне заархивировать требуемый результат

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Если вы не против иметь одно поле для даты и времени, то здесь можно использовать DATE_FORMAT:

SELECT
    DATE_FORMAT(record, '%Y-%m-%d %H') AS ts,
    COUNT(*) AS passed
FROM counter
GROUP BY
    DATE_FORMAT(record, '%Y-%m-%d %H');
0 голосов
/ 20 сентября 2019

Пожалуйста, попробуйте это:

SELECT 
DATE_FORMAT(record, '%Y-%m-%d) as dt,
DATE_FORMAT(record, '%h:%i) as ts,
COUNT(*) AS passed
FROM counter
GROUP BY 
DATE_FORMAT(record, '%Y-%m-%d) as dt,
DATE_FORMAT(record, '%h:%i) as ts;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...