mysql 连续日期统计_MySQL高阶统计每周连续出现天数
时间: 2023-08-29 18:13:16 浏览: 54
可以使用 MySQL 的日期函数和子查询实现连续日期统计,具体步骤如下:
1. 构造一个包含所有需要统计的日期的临时表,可以使用 UNION ALL 来实现,例如统计从 2022-01-01 到 2022-01-31 的日期:
```
SELECT DATE('2022-01-01') AS date
UNION ALL SELECT DATE('2022-01-02')
UNION ALL SELECT DATE('2022-01-03')
...
UNION ALL SELECT DATE('2022-01-31');
```
2. 使用子查询查询连续出现的天数,首先需要找到每个连续日期段的起始日期和结束日期,可以通过自连接的方式实现。假设有一个名为 `date_table` 的表存储了所有需要统计的日期,可以使用以下 SQL 语句查询连续日期段:
```
SELECT a.date AS start_date, MIN(c.date) AS end_date
FROM date_table a
LEFT JOIN date_table b ON b.date = DATE_SUB(a.date, INTERVAL 1 DAY)
LEFT JOIN date_table c ON c.date = DATE_ADD(a.date, INTERVAL 1 DAY)
WHERE b.date IS NULL OR c.date IS NULL
GROUP BY a.date;
```
上述 SQL 语句会找到所有连续出现的日期段的起始日期和结束日期,例如:
```
+------------+------------+
| start_date | end_date |
+------------+------------+
| 2022-01-01 | 2022-01-01 |
| 2022-01-02 | 2022-01-03 |
| 2022-01-04 | 2022-01-04 |
| 2022-01-07 | 2022-01-08 |
| 2022-01-09 | 2022-01-09 |
| 2022-01-10 | 2022-01-10 |
+------------+------------+
```
3. 使用上一步查询到的连续日期段,结合日期函数和 GROUP BY 子句,统计每个连续日期段内的天数:
```
SELECT start_date, end_date, COUNT(*) AS count
FROM (
SELECT a.date AS start_date, MIN(c.date) AS end_date
FROM date_table a
LEFT JOIN date_table b ON b.date = DATE_SUB(a.date, INTERVAL 1 DAY)
LEFT JOIN date_table c ON c.date = DATE_ADD(a.date, INTERVAL 1 DAY)
WHERE b.date IS NULL OR c.date IS NULL
GROUP BY a.date
) AS t
JOIN date_table d ON d.date BETWEEN t.start_date AND t.end_date
GROUP BY start_date, end_date;
```
上述 SQL 语句会输出每个连续日期段的起始日期、结束日期和连续出现的天数,例如:
```
+------------+------------+-------+
| start_date | end_date | count |
+------------+------------+-------+
| 2022-01-01 | 2022-01-01 | 1 |
| 2022-01-02 | 2022-01-03 | 2 |
| 2022-01-04 | 2022-01-04 | 1 |
| 2022-01-07 | 2022-01-08 | 2 |
| 2022-01-09 | 2022-01-09 | 1 |
| 2022-01-10 | 2022-01-10 | 1 |
+------------+------------+-------+
```
注意,上述 SQL 语句中的 `date_table` 表需要根据实际情况替换为实际的表名或子查询。