SQL 跨年周留存計算

2022-07-02 14:54:12 字數 3363 閱讀 7059

正常計算周留存,可以直接用weekofyear(t1.dt) = weekofyear(t2.dt) -1

但是如果遇到跨年,按照一年52個周,新年又從1開始,導致跨年的周留存,計算不出來;

每一周的開始日期和結束日期是相對固定的,可以先把日期固定到周,然後取各個周的開始日期,本週與下週的開始日期,固定的日期之差正好是7天,就可以計算跨年周留存;

with tmp_da_user as (

select ds --日期

,event_id --訪問、事件

,page --頁面

,user_id

,dtfrom (select *

,to_date(ds,'yyyymmdd') as dt

from ods_all_mobile_log)t

where ds between '20210301' and '20210317'

and page = 'pageid-degg34f9' --頁面

-- and elementid in ('elementid-97f76ha3') --事件

and event_id = 2001 --2001訪問、19999事件

group by ds

,dt

,event_id

,page --頁面

,user_id

--,elementid --事件

),tmp_da_user_weekly as (

select

weekly

,to_date(start_weekly,'yyyymmdd') as start_weekly

,weekly_range

,event_id

,page --頁面

,user_id

from (select

*,weekofyear(dt) as weekly

,to_char(dateadd(dt,-weekday(dt),'dd'),'yyyymmdd') as start_weekly

,concat(to_char(dateadd(dt,-weekday(dt),'dd'),'yyyymmdd')

,'~',to_char(dateadd(dt,6-weekday(dt),'dd'),'yyyymmdd')) as weekly_range

from tmp_da_user )

group by

weekly

,start_weekly

,weekly_range

,event_id

,page --頁面

,user_id

)select

t1.weekly

,t1.start_weekly

,t1.weekly_range

,t1.event_id

,t1.page --頁面

,count(distinct t1.user_id) as uv

,count(distinct t2.user_id) as 次週留存uv

from tmp_da_user_weekly t1

left join tmp_da_user_weekly t2

on (t1.page = t2.page

and t1.user_id = t2.user_id

and t1.event_id = t2.event_id

and datediff(t2.start_weekly,t1.start_weekly) = 7

)group by

t1.weekly

,t1.start_weekly

,t1.weekly_range

,t1.event_id

,t1.page --頁面

with tmp_da_user_weekly as (

select weekofyear(dt) as weekly --日期

,concat(to_char(dateadd(dt,-weekday(dt),'dd'),'yyyymmdd')

,'~',to_char(dateadd(dt,6-weekday(dt),'dd'),'yyyymmdd')) as weekly_range

,event_id --訪問、事件

,page --頁面

,user_id

from (select *

,to_date(ds,'yyyymmdd') as dt

from ods_all_mobile_log)t

where ds between '20210301' and '20210317'

and page = 'pageid-degg34f9' --頁面

-- and elementid in ('elementid-97f76ha3') --事件

and event_id = 2001 --2001訪問、19999事件

group by weekofyear(dt)

,concat(to_char(dateadd(dt,-weekday(dt),'dd'),'yyyymmdd')

,'~',to_char(dateadd(dt,6-weekday(dt),'dd'),'yyyymmdd'))

,event_id

,page --頁面

,user_id

)select

t1.weekly

,t1.weekly_range

,t1.event_id

,t1.page --頁面

,count(distinct t1.user_id) as uv

,count(distinct t2.user_id) as 次週留存uv

from tmp_da_user_weekly t1

left join tmp_da_user_weekly t2

on (t1.page = t2.page

and t1.user_id = t2.user_id

and t1.weekly = t2.weekly - 1

)group by

t1.weekly

,t1.weekly_range

,t1.event_id

,t1.page --頁面

sql計算留存 SQL 使用者月留存率

sql 使用者月留存率 sql資料分析 6月4日sql 使用者月留存率 需求背景 根據訂單表,統計每個月在接下來幾個月使用者複購情況 如 5月下單使用者10000人 這10000人又在6月又下單的使用者有5000人,這10000人在7月下單的使用者有8000人 解析思路 核心 資料預處理 使用者,月...

SQL計算留存率等指標

1.1計算某日留存率 次日 3日 7日 30日 計算次日 3日 7日 30日留存率 select log day,count user id d1 count user id d0 retention d1,count user id d3 count user id d0 retention d3...

跨年3周安排

單詞第一輪 每天70個新單詞,所有系統加進來的複習單詞,2月28日結束 408筆記整理 12月22日 1月8日 12.22學年 408筆記 作業系統 12.23寫作 408筆記 12.24 設計 408筆記 12.25市場調查 408筆記 12.26erp 12.27安排設計模式和市場調查複習 12...