我正在尝试获取数据,以向用户展示该人进行了多少次会话的概览。该表的结构类似:
session_id | 用户 | 开始时间 |
---|---|---|
1 | 用户A | 2022-01-01 |
2 | 用户A | 2023-01-02 |
3 | 用户A | 2023-03-15 |
4 | 用户A | 2023-03-16 |
5 | 用户A | 2023-03-02 |
6 | 用户A | 2023-03-10 |
是否可以构造一个查询,从中获取每个月的会话计数,从用户拥有的第一个会话开始,直到当前月份。我想要的输出可能类似于下面的示例。
月 | 计数(session_id) |
---|---|
1 月 22 日 | 1 |
2月22日 | 0 |
...-22 | 0 |
12 月 22 日 | 0 |
1 月 23 日 | 1 |
2月23日 | 0 |
3月23日 | 4 |
4 月 23 日 | 0 |
我尝试创建以下查询:
SELECT DATE_FORMAT(DATE_ADD(min_month, INTERVAL m.n MONTH), '%Y-%m') as month,
COALESCE(COUNT(c.consumption), 0) as total_consumption
FROM
(SELECT DATE_FORMAT(MIN(start_time), '%Y-%m-01') as min_month
FROM session
WHERE user_id = 'sGcO42wMx1ZHXwZpZH3KWwWXzd13') as start_month
CROSS JOIN
(SELECT n
FROM (SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) as n) as m
LEFT JOIN session as c ON DATE_FORMAT(c.start_time, '%Y-%m') = DATE_FORMAT(DATE_ADD(start_month.min_month, INTERVAL m.n MONTH), '%Y-%m')
AND c.user_id = 'sGcO42wMx1ZHXwZpZH3KWwWXzd13'
GROUP BY month
ORDER BY month ASC;
但是回来的结果只有10个月:
月 | 计数(session_id) |
---|---|
1 月 22 日 | 1 |
...-22 | 0 |
10 月 22 日 | 0 |
借助 StackExchange 的这个结果:在 mysql 中的日期范围之间生成日期 我能够弄清楚如何获得正确的结果。
通过创建一个名为 Date_Ranges 的递归表,我能够根据用户拥有的第一个会话创建表,直到当天。有了这个我做了一个 LEFT JOIN 到,从原始表中获取会话数。
因此,预期的查询是:
WITH recursive Date_Ranges AS (
SELECT (SELECT start_time FROM user.session WHERE user_id = 'sGcO42wMx1ZHXwZpZH3KWwWXzd13' ORDER BY start_time ASC LIMIT 1) AS d
UNION ALL
SELECT d + interval 1 month
FROM Date_Ranges
WHERE d < NOW()
)
SELECT DATE_FORMAT(dates.d, '%b-%y') AS Month, COUNT(s.session_id) AS Count
FROM Date_Ranges dates
LEFT JOIN user.session s ON DATE_FORMAT(s.start_time, '%Y-%m') = DATE_FORMAT(dates.d, '%Y-%m') AND s.user_id = 'sGcO42wMx1ZHXwZpZH3KWwWXzd13'
GROUP BY Month;
并生成了我想要的表格响应。