微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

所有历史记录的sql每月现有用户

如何解决所有历史记录的sql每月现有用户

我有一个用于用户注册间的用户数据库

id,signup_time
100    2020-09-01
001    2018-01-01
....

如何查找所有历史记录的每月现有用户?使用该月的最后一天作为截止日期,现有用户意味着,如果我观察到2020-07-31的最后一天,则该用户已经在2020-07-01之前注册。如果我在2020年6月最后一天2020年6月观察到,则该用户已经在2020-06-01年之前注册

新用户意味着,如果我观察到2020年7月20日的最后一天,则该用户仅在7月而不是7月之前注册,而在2020-07-01至2020-07-31之间的7月之后才注册。 我可以按月找​​到新用户

SELECT COUNT(disTINCT id) AS new_user_count,year_month
FROM(
SELECT id,date_part('month',signup_time) AS signup_time_month,date_part('year',signup_time) AS signup_time_year,concat(date_part('year',signup_time),'-',lpad(date_part('month',signup_time)::text,2,'0')) AS year_month,signup_time
             
      FROM users)
GROUP BY year_month

类似于其他语言中的for循环:

observation_year_month_list = ['2020-04','2020-05','2020-06']

 for i in observation_year_month_list:
      
     if user signup_time  < i:
        monthly_existing_user_count+1
    

解决方法

我认为您想对每个用户进行首次登录,并计算出每月的累积计数。如果是这样,您可以使用两种聚合级别:

select 
    first_sign_month
    sum(count(*)) over(order by first_sign_month) total_users 
from (
    select id,date_trunc('month',min(signup_time)) first_sign_month
    from mytable
    group by id
) t
group by first_sign_month

由于您似乎正在使用Postgres,因此我使用date_trunc()将日期截断为该月的第一天。如果您希望使用最初使用的格式的字符串,则可以使用to_char(signup_time,'yyyy-mm')

,

我希望我能理解您要做什么。

SELECT COUNT(*) AS existing_user_count,year_month
FROM(
SELECT id,DATEDIFF(signup_time - DATEADD(month,-1,GETDATE())) AS day_diff,date_part('month',signup_time) AS signup_time_month,date_part('year',signup_time) AS signup_time_year,concat(date_part('year',signup_time),'-',lpad(date_part('month',signup_time)::text,2,'0')) AS year_month,signup_time
         
FROM users
WHERE day_diff > 0)
GROUP BY year_month

-希望这越来越近了-

WITH View AS
(
SELECT year_month,COUNT(*) AS monthly_newuser
FROM(
    SELECT id,DATEADD(month,1,signup_time)),signup_time))::text,'0')) 
           AS year_month         
FROM users
GROUP BY year_month
)

SELECT year_month,SUM(monthly_newuser) over (ORDER BY year_month) AS existing_user_cnt
FROM View

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。