如何解决所有历史记录的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 举报,一经查实,本站将立刻删除。