计算两天之间的所有行数。如果两个日期之间没有行,则返回 0

问题描述 投票:0回答:1

我正在尝试获取数据,以向用户展示该人进行了多少次会话的概览。该表的结构类似:

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
sql mysql recursive-query
1个回答
1
投票

借助 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;

并生成了我想要的表格响应。

© www.soinside.com 2019 - 2024. All rights reserved.