sql里查询一个组和组的用户数怎么查?_【牛客网SQL刷题】留存率怎么算?
抽空刷了牛客網SQL實戰72題,最后幾道以牛客網為例的題目還挺有挑戰性,在此記錄
- 統計時間段新用戶次日留存率
- 每日的次日留存率
- 每日的新用戶數
- 每日新用戶的次日留存
- 求新登錄用戶次日留存
表login第1行表示id為2的用戶在2020-10-12使用了客戶端id為1的設備第一次新登錄了牛客網。需寫出一個sql語句查詢新登錄用戶次日成功的留存率,即第1天登陸之后,第2天再次登陸的概率,保存小數點后面3位(3位之后的四舍五入),例子查詢結果如下:
(sqlite里查找某一天的后一天的用法是:date(yyyy-mm-dd, '+1 day'),四舍五入的函數為round,sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才會得到0.5)
--Step1:篩選統計期內,用戶首次登錄的信息(user_id以及date) select user_id,min(date) as date from login group by user_id--Step2:步驟一得到的表a和login表連接,計算出在登錄后的第二天又登錄的用戶數 ----------- 滿足首次登錄日期+1day=第二天登錄日期 ----------- 如果不滿足,b表里對應的數據為null select count(distinct b.user_id) from (select user_id,min(date) as date from login group by user_id) a left join login b on a.user_id=b.user_id and b.date=date(a.date,'+1 day')--Step3:計算次日留存 次日登錄用戶數/登錄用戶數 select round(count(distinct b.user_id )*1.0/count(distinct a.user_id),3) as p from (select user_id,min(date) as date from login group by user_id)as a left join login b on b.user_id=a.user_id and b.date=date(a.date,'+1 day')- 查詢每個日期登錄新用戶數
查詢每個日期登錄新用戶個數,并且查詢結果按照日期升序排序,上面的例子查詢結果如下:(輸出0,可以用sqlite的ifnull函數嘗試實現,select ifnull(null,1)的輸出是1)
--Step1:篩選出所有日期,并升序排列 select date from login group by date order by date--Step2:篩選出每個用戶首次登錄的時間 select user_id,min(date) as date from login group by user_id--Step3:將兩張表連接 select * from (select date from login GROUP BY date order by date) a left join (select user_id,min(date) as date from login group by user_id) b on a.date=b.date--按照a.date分組,求出每組的人數 select a.date,count(b.user_id) as new from (select date from login GROUP BY date order by date) a left join (select user_id,min(date) as date from login group by user_id) b on a.date=b.date group by a.date 思路示意圖- 查詢每個日期新用戶的次日留存率
結果保留小數點后面3位數(3位之后的四舍五入),并且查詢結果按照日期升序排序
--step1:篩選出每日新登錄用戶的user_id SELECT a.date,b.user_id as 登陸新用戶 from (SELECT date from login group by date order by date) a left join (SELECT user_id,min(date) as date from login group by user_id) b on a.date=b.date--step2:在每日新登錄用戶信息后追加一列第二天仍繼續登錄的user_id --------條件滿足 首次登錄日期+1 day=第二天登錄日期 left join login c on DATE_ADD(b.date,INTERVAL 1 day)=c.date group by a.date order by a.date--step3:計算次日留存率 --首日登錄人數 count(distinct b.user_id) 次日登錄數count(distinct c.user_id) --將結果null替換成0,可以用case when 解決 SELECT a.date , case when count(b.user_id)=0 then 0.000 else round(count(DISTINCT c.user_id)*1.0/count(DISTINCT b.user_id),3) end as p from (SELECT date from login group by date) a left join (SELECT user_id,min(date) as date from login group by user_id) b on a.date=b.date left join login c on date(b.date,'+1 day')=c.date group by a.date order by a.date ;- 統計刷題用戶信息
統計每個用戶查詢刷題信息,包括: 用戶的名字,以及用戶用的設備名字,以及截止到某天,累計總共通過了多少題。查詢結果先按照日期升序排序,再按照姓名升序排序,有登錄卻沒有刷題的那一天的數據不需要輸出(不存在沒有登錄卻刷題的情況,但是存在登錄了沒刷題的情況,不會存在刷題表里面,有提交代碼沒有通過的情況,但是會記錄在刷題表里,只不過通過數目是0)
就是考察表連接,同時注意累計求和 SELECT c.name as u_n,d.name as c_n,b.date as date, sum(number) over (partition by b.user_id order by b.date) FROM passing_number as b left join user as c on b.user_id = c.id left join login as a on b.user_id = a.user_id and b.date = a.date left join client as d on a.client_id = d.id order by b.date,c.name題目里的數據鏈接 提取碼: 8jp8
。
總結
以上是生活随笔為你收集整理的sql里查询一个组和组的用户数怎么查?_【牛客网SQL刷题】留存率怎么算?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kettle将多个文件压缩_如何使用Wi
- 下一篇: 买入基金会赔到负数吗