Проблема в том, что вам нужно сгруппировать по дням (записей в день), а затем сгруппировать по месяцам (максимум записей в день в месяце).Вы можете сделать это одним запросом, но я думаю, что нет эффективного и простого способа добиться этого, поскольку вы не можете использовать производные таблицы несколько раз.Вот что я предлагаю:
Допустим, у вас есть такая таблица:
MariaDB [test]> create table dates (date datetime, data int default null);
Query OK, 0 rows affected (0.02 sec)
Поместите в несколько строк:
MariaDB [test]> select * from dates;
+---------------------+------+
| date | data |
+---------------------+------+
| 2018-10-03 00:00:00 | NULL |
| 2018-01-01 00:00:00 | NULL |
| 2018-01-02 00:00:00 | NULL |
| 2018-01-02 00:00:00 | NULL |
| 2018-01-02 00:00:00 | NULL |
| 2018-01-03 00:00:00 | NULL |
| 2018-01-03 00:00:00 | NULL |
| 2018-02-01 00:00:00 | NULL |
+---------------------+------+
8 rows in set (0.00 sec)
Пример group by
(записив день):
MariaDB [test]> select count(*) entries, year(date) y, month(date) m, day(date) d from dates group by y, m, d;
+---------+------+------+------+
| entries | y | m | d |
+---------+------+------+------+
| 1 | 2018 | 1 | 1 |
| 3 | 2018 | 1 | 2 |
| 2 | 2018 | 1 | 3 |
| 1 | 2018 | 2 | 1 |
| 1 | 2018 | 10 | 3 |
+---------+------+------+------+
5 rows in set (0.00 sec)
Отсюда будет сложно.Чтобы обойти это, мы создаем представление:
MariaDB [test]> create view counts_per_day as (select count(*) entries, year(date) y, month(date) m, day(date) d from dates group by y, m, d);
Query OK, 0 rows affected (0.01 sec)
MariaDB [test]> select * From counts_per_day;
+---------+------+------+------+
| entries | y | m | d |
+---------+------+------+------+
| 1 | 2018 | 1 | 1 |
| 3 | 2018 | 1 | 2 |
| 2 | 2018 | 1 | 3 |
| 1 | 2018 | 2 | 1 |
| 1 | 2018 | 10 | 3 |
+---------+------+------+------+
5 rows in set (0.00 sec)
С этим представлением следующая часть намного проще, поскольку это типичная проблема great-n-per-group :
MariaDB [test]> select entries, a.y, a.m, a.d from counts_per_day a inner join (select y, m, max(entries) max_entries from counts_per_day group by y, m) b on a.entries = max_entries and a.y = b.y and a.m = b.m;
+---------+------+------+------+
| entries | y | m | d |
+---------+------+------+------+
| 3 | 2018 | 1 | 2 |
| 1 | 2018 | 2 | 1 |
| 1 | 2018 | 10 | 3 |
+---------+------+------+------+
3 rows in set (0.00 sec)