Найти конкретный день с максимальным значением данных за месяц (2x наибольший n на группу) - PullRequest
0 голосов
/ 03 октября 2018

У меня более 10000+ строк / строк данных за один день.

Как узнать, какая дата в месяце имеет максимальное количество строк / строк?Я хочу найти тренд максимального числа перерывов каждый месяц.

enter image description here

1 Ответ

0 голосов
/ 03 октября 2018

Проблема в том, что вам нужно сгруппировать по дням (записей в день), а затем сгруппировать по месяцам (максимум записей в день в месяце).Вы можете сделать это одним запросом, но я думаю, что нет эффективного и простого способа добиться этого, поскольку вы не можете использовать производные таблицы несколько раз.Вот что я предлагаю:

Допустим, у вас есть такая таблица:

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)
...