#### 第3句 今日流失用戶 ##### 需求: 當日流失用戶的定義:昨天登錄的,今天沒登錄的用戶數 有一張用戶登錄日誌表,有欄位 date_stamp(日期時間戳),用戶id(uid)。如果用戶在某天登錄了,該表會有一條記錄。 ``` #今天流失人數:昨天登錄,今天沒登錄的 select a.d ...
第3句 今日流失用戶
需求:
當日流失用戶的定義:昨天登錄的,今天沒登錄的用戶數
有一張用戶登錄日誌表,有欄位 date_stamp(日期時間戳),用戶id(uid)。如果用戶在某天登錄了,該表會有一條記錄。
#今天流失人數:昨天登錄,今天沒登錄的
select a.date_stamp+86400 as date ,count(*) as num
from
user_date a
left join user_date b
on a.date_stamp = b.date_stamp -86400 and a.uid =b.uid
where b.date_stamp is null and a.date_stamp+86400 >=UNIX_TIMESTAMP('2023-08-01 00:00:00')
group by date
解析:
a 表和b表的連接條件是 uid相同 且時間戳相差一天,a 即前一天,b即當天。 如果流失了,則 a 存在而b不存在。查出結果之後 因為要算當天,a的時間戳需要加一天。
同理可以寫出類似的 複活用戶數(前一天未登錄,當天登錄)和 留存用戶數(前一天和當天都登錄的用戶數)
註意點: 我們經常會用到 select x as y 這樣的語句,但是這個 y 只能用在 group 子句,而where 後面是不可以的。
知識點: 表的多重連接條件
ps: 這個查詢速度比較慢,歡迎大佬們提出優化建議