SQL查詢用戶連續(xù)N天登錄
業(yè)務(wù)中常見(jiàn)分析之一是分析用戶連續(xù)登錄使用情況,這也對(duì)應(yīng)著SQL常見(jiàn)面試題——用戶連續(xù)N天登錄問(wèn)題。
我們假設(shè)現(xiàn)在有一張用戶登錄信息表user_login_info,表中字段有用戶id(uid)、登錄時(shí)間(login_time)。表中數(shù)據(jù)如下所示:

現(xiàn)在要求查詢出連續(xù)登錄N天的用戶。
(1) 首先我們要對(duì)用戶登錄表進(jìn)行去重操作,以避免用戶當(dāng)天多次登錄情況對(duì)查詢結(jié)果產(chǎn)生影響。這里用到了distinct關(guān)鍵詞。
select uid, distinct date(login_time) as login_time from user_login_info
(2)其次我們使用窗口排名函數(shù)row_number對(duì)同一用戶的不同登錄時(shí)間進(jìn)行排名,得到新一列為rk。
select
uid,
login_time,
row_number() over(partition by uid order by login_time) as rk
from
(
select
uid,
distinct date(login_time) as login_time
from user_login_info
) t1查詢結(jié)果如圖所示:

(3)之后用date_sub函數(shù)計(jì)算登錄時(shí)間login_time一列加上rk天之后生成新的一列sub_date。假如在表格中,同一用戶的sub_date相同則說(shuō)明相同sub_date數(shù)據(jù)的行是連續(xù)登錄使用的情況。
select *, DATE_SUB(login_time, INTERVAL rk DAY) as sub_date
from
(
select
uid,
login_time,
row_number() over(partition by uid order by login_time) as rk
from
(
select
uid,
distinct date(login_time) as login_time
from user_login_info
) t1
) t2查詢結(jié)果如圖所示:

(4)之后我們對(duì)得到的查詢結(jié)果,按照用戶id,登錄時(shí)間進(jìn)行分組計(jì)數(shù),得到的計(jì)數(shù)結(jié)果就是用戶連續(xù)登錄多少天的情況記錄。
select uid, count(*) as 連續(xù)登錄天數(shù) from ( SELECT *, DATE_SUB(login_time, INTERVAL rk DAY) AS sub_date from ( select uid, login_time, row_number() over(partition by uid order by login_time) as rk from ( select uid, distinct date(login_time) as login_time from user_login_info ) t1 ) t2 ) t3 group by uid, sub_date

(5)之后我們可以在此查詢結(jié)果上,根據(jù)需要用having條件就可以篩選出我們想要得知的連續(xù)N天登錄的用戶id
完整代碼如下:
select uid, count(*) as 連續(xù)登錄天數(shù) from ( SELECT *, DATE_SUB(login_time, INTERVAL rk DAY) AS sub_date from ( select uid, login_time, row_number() over(partition by uid order by login_time) as rk from ( select uid, distinct date(login_time) as login_time from user_login_info ) t1 ) t2 ) t3 group by uid, sub_date having 連續(xù)登錄天數(shù) = N
到此這篇關(guān)于SQL查詢用戶連續(xù)N天登錄的文章就介紹到這了,更多相關(guān)SQL查詢連續(xù)N天登錄內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sql server通過(guò)pivot對(duì)數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法
這篇文章主要介紹了sql server通過(guò)pivot對(duì)數(shù)據(jù)進(jìn)行行列轉(zhuǎn)換的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
MS SQL Server游標(biāo)(CURSOR)的學(xué)習(xí)使用
使用MS SQL Server這樣久,游標(biāo)一直沒(méi)有使用過(guò)。以前都是使用WHILE循環(huán)加臨時(shí)表來(lái)實(shí)現(xiàn)。剛剛聯(lián)系個(gè)示例了解到游標(biāo)概念與語(yǔ)法2014-06-06
Microsoft Search 服務(wù)無(wú)法啟動(dòng) 解決辦法.
嘗試用正常系統(tǒng)的注冊(cè)表項(xiàng)添加到非正常系統(tǒng)中去。(因?yàn)閷?duì)比的兩個(gè)系統(tǒng)版本、結(jié)構(gòu)相同,所此次就直接通過(guò)導(dǎo)入導(dǎo)出注冊(cè)表項(xiàng)進(jìn)行批量修改)。2009-04-04
sql server刪除前1000行數(shù)據(jù)的方法實(shí)例
最近處理數(shù)據(jù)的時(shí)候遇到了個(gè)問(wèn)題,需要利用sql刪除表格的前1000行數(shù)據(jù),嘗試過(guò)后這里給大家分享下過(guò)程,所以下面這篇文章主要給大家介紹了關(guān)于sql server刪除前1000行數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2021-08-08
SQL?Server?2008R2安裝詳細(xì)圖文教程(附安裝包)
這篇文章詳細(xì)介紹了如何安裝SQL?Server,包括下載安裝包、安裝步驟和注意事項(xiàng),文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
SQL SERVER中強(qiáng)制類型轉(zhuǎn)換cast和convert的區(qū)別詳解
這篇文章主要介紹了SQL SERVER中強(qiáng)制類型轉(zhuǎn)換cast和convert的區(qū)別詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11

