查找一个月内具有最大数据值的特定日期(每个组最大值的2倍)

vojdkbi0  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(394)

我一天有超过10000行/行的数据。
我怎么知道一个月中哪个日期的行数最多?我想找出每个月最大休息次数的趋势。

j13ufse2

j13ufse21#

问题是您需要按天分组(每天的条目),然后按月分组(一个月内每天的最大条目数)。您可以在一个查询中实现这一点,但我认为没有有效且简单的方法来实现这一点,因为您不能多次使用派生表。以下是我的建议:
假设你有一张这样的table:

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)

有了这个观点,下一部分就简单多了,因为这是一个典型的最大n个组的问题:

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)

相关问题