SQL 每个月 select 的好方法

Neat Way to select every month in SQL

我试图找出每个月的用户数量。 这是我从另一个问题中学到的SQL。

创建月份的部分很容易理解,但是很长。我想知道是否有更简洁的方法来编写相同的 SQL。谢谢

SELECT
    meses.MONTH,
    COUNT(Users.user_ID) AS num_of_user
FROM
    (
    SELECT
        1 AS MONTH
    UNION
SELECT
    2 AS MONTH
UNION
SELECT
    3 AS MONTH
UNION
SELECT
    4 AS MONTH
UNION
SELECT
    5 AS MONTH
UNION
SELECT
    6 AS MONTH
UNION
SELECT
    7 AS MONTH
UNION
SELECT
    8 AS MONTH
UNION
SELECT
    9 AS MONTH
UNION
SELECT
    10 AS MONTH
UNION
SELECT
    11 AS MONTH
UNION
SELECT
    12 AS MONTH
) AS meses
LEFT JOIN
    Users
ON
    meses.month = MONTH(Users.joint_date) AND YEAR(Users.joint_date) = '2000'
GROUP BY
    meses.MONTN

在MySQL 8.0中,您可以使用递归查询来生成序列。

我还建议根据文字日期进行过滤,而不是在要过滤的列上应用日期函数:这样效率更高,并且可以利用 users(joint_date).

上的索引
with dates as (
    select '2020-01-01' dt
    union all select dt + interval 1 month from dates where dt + interval 1 month < '2021-01-01'
)
select d.dt, count(u.user_id) as num_of_users
from dates d
left join users u 
    on  u.joint_date >= d.dt
    and u.joint_date <  d.dt + interval 1 month
group by d.dt

在早期版本中,您确实需要使用 union 枚举日期。但是我仍然会推荐文字日期技术。看起来像:

select '2020-01-01' + interval n.n month as dt, count(u.user_id) as num_of_users
from (select 0 n union all select 2 ... union all select 11) n
left join users u 
    on  u.joint_date >= '2020-01-01' + interval n.n month
    and u.joint_date <  '2020-01-01' + interval (n.n + 1) month
group by n.n