【问题标题】:Neat Way to select every month in SQL在 SQL 中选择每个月的巧妙方法
【发布时间】:2021-03-05 05:07:22
【问题描述】:

我正在尝试查找每个月的用户数量。 这是我从另一个问题中学到的 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

【问题讨论】:

  • 考虑处理应用代码中数据显示的问题
  • 顺便说一下,您只需要第一个“AS MONTH”。

标签: mysql sql datetime count recursive-query


【解决方案1】:

在 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

【讨论】:

  • 您是否有机会解释/评论您的代码是如何工作的?
猜你喜欢
  • 2020-05-03
  • 2016-04-19
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多