從用戶連續(xù)活躍的最大天數(shù)說起

問題引入

最近經(jīng)常碰到這樣的問題,每天每個城市播放最多的10首歌,某月每支股票連續(xù)下跌/上漲的最大天數(shù)烛亦,用戶連續(xù)活躍的最大天數(shù),初步看起來都和分析函數(shù)相關(guān)懂拾,考驗(yàn)邏輯思維和寫復(fù)雜SQL的能力煤禽。

以用戶連續(xù)活躍的最大天數(shù)為例

以O(shè)racle的分析函數(shù)語法說明,首先模擬一些用戶活躍的數(shù)據(jù)岖赋,

-- 建表語句
DROP TABLE sigin;
create table sigin(
userid int, 
sigindate varchar2(20) 
); 

-- 模擬數(shù)據(jù)插入

insert into sigin values(1,'2017-01-01');
insert into sigin values(1,'2017-01-02');
insert into sigin values(1,'2017-01-03');
insert into sigin values(1,'2017-01-04');
insert into sigin values(2,'2017-01-01');
insert into sigin values(2,'2017-01-02');
insert into sigin values(2,'2017-01-03');

insert into sigin values(1,'2017-01-10');
insert into sigin values(2,'2017-01-10');
insert into sigin values(1,'2017-01-11');
insert into sigin values(2,'2017-01-11');
insert into sigin values(1,'2017-01-12');
insert into sigin values(2,'2017-01-12');
commit;

大體思路如下:

  • 首先根據(jù)userid進(jìn)行分組檬果,將用戶所有活躍的記錄依次按照時間排序并標(biāo)上序號。
  • 根據(jù)時間有序的特點(diǎn)唐断,將所有時間減去它對應(yīng)的序號选脊,獲取連續(xù)活躍時間唯一的時間點(diǎn)。如
2017-01-01 1
2017-01-02 2
2017-01-03 3

時間減去序號脸甘,得唯一時間2016-12-31恳啥。

  • 根據(jù)userid和這個連續(xù)活躍時間唯一的時間點(diǎn)進(jìn)行分組,計算連續(xù)活躍天數(shù)丹诀。
-- 每個用戶的幾段連續(xù)活躍的天數(shù)
select 
userid,
to_date(sigindate,'yyyy-mm-dd')-sigin_rank as date_rank,
count(1) as sigincount
from 
(
select 
userid,
sigindate,
row_number() over(partition by userid order by sigindate) as sigin_rank
 from sigin
 ) c group by userid, to_date(sigindate,'yyyy-mm-dd')-sigin_rank;

得到結(jié)果1如下钝的,

USERID  DATE_RANK   SIGINCOUNT
1   2017/1/5    3
2   2017/1/6    3
1   2016/12/31  4
2   2016/12/31  3

上述方法可以找到每個用戶的連續(xù)活躍天數(shù)翁垂,但用戶中間有中斷時程序就無法滿足,一個用戶出現(xiàn)了多條記錄硝桩,分別為用戶的多段連續(xù)活躍所產(chǎn)生沿猜。

我們最終的目標(biāo)是得到用戶連續(xù)活躍的最大天數(shù),可利用上述方法所得到的結(jié)果碗脊,在外面再嵌套一層啼肩,針對userid進(jìn)行g(shù)roup by,得到每個用戶的最大活躍天數(shù)望薄。

select d.userid, Max(d.sigincount) as max_sigincount from (
select 
userid,
to_date(sigindate,'yyyy-mm-dd')-sigin_rank as date_rank,
count(1) as sigincount
from 
(
select 
userid,sigindate,row_number() over(partition by userid order by sigindate) as sigin_rank
 from sigin
 ) c group by userid ,to_date(sigindate,'yyyy-mm-dd')-sigin_rank 

) d  group by d.userid

得到結(jié)果2如下疟游,

USERID  MAX_SIGINCOUNT
1   4
2   3

如果還需要得到用戶連續(xù)活躍最大天數(shù)中這一段的首次活躍時間,可以把以上兩個結(jié)果進(jìn)行關(guān)聯(lián)得到痕支。

-- 每個用戶連續(xù)活躍的最大天數(shù)和連續(xù)活躍的第一天的時間
 select f.userid,g.date_rank+1,f.max_sigincount from (
select d.userid, Max(d.sigincount) as max_sigincount from (
select 
userid,
to_date(sigindate,'yyyy-mm-dd')-sigin_rank as date_rank,
count(1) as sigincount
from 
(
select 
userid,sigindate,row_number() over(partition by userid order by sigindate) as sigin_rank
 from sigin
 ) c group by userid ,to_date(sigindate,'yyyy-mm-dd')-sigin_rank 

) d  group by d.userid
) f inner join (
select 
userid,
to_date(sigindate,'yyyy-mm-dd')-sigin_rank  as date_rank,
count(1) as sigincount
from 
(
select 
userid,sigindate,row_number() over(partition by userid order by sigindate) as sigin_rank
 from sigin
 ) c group by userid ,to_date(sigindate,'yyyy-mm-dd')-sigin_rank 

) g on f.userid = g.userid and f.max_sigincount = g.sigincount;

得到結(jié)果3如下,

USERID  G.DATE_RANK+1   MAX_SIGINCOUNT
2   2017/1/7    3
1   2017/1/1    4
2   2017/1/1    3

結(jié)果3還存在一個問題蛮原,如果用戶有兩段連續(xù)活躍的天數(shù)相同且最大卧须,則第二段連續(xù)活躍的首次活躍時間是不對的,這個問題怎么解決呢儒陨?歡迎留言你的解決方案花嘶。


本文首發(fā)于steem,感謝閱讀蹦漠,轉(zhuǎn)載請注明椭员。

https://steemit.com/@padluo


微信公眾號「padluo」,分享數(shù)據(jù)科學(xué)家的自我修養(yǎng)笛园,既然遇見隘击,不如一起成長。

數(shù)據(jù)分析

讀者交流電報群

https://t.me/sspadluo


知識星球交流群

知識星球讀者交流群
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末研铆,一起剝皮案震驚了整個濱河市埋同,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棵红,老刑警劉巖凶赁,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逆甜,居然都是意外死亡虱肄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門交煞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咏窿,“玉大人,你說我怎么就攤上這事错敢『苍郑” “怎么了缕粹?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纸淮。 經(jīng)常有香客問我平斩,道長,這世上最難降的妖魔是什么咽块? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任绘面,我火速辦了婚禮,結(jié)果婚禮上侈沪,老公的妹妹穿的比我還像新娘揭璃。我一直安慰自己,他們只是感情好亭罪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布瘦馍。 她就那樣靜靜地躺著,像睡著了一般应役。 火紅的嫁衣襯著肌膚如雪情组。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天箩祥,我揣著相機(jī)與錄音院崇,去河邊找鬼。 笑死袍祖,一個胖子當(dāng)著我的面吹牛底瓣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蕉陋,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捐凭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寺滚?” 一聲冷哼從身側(cè)響起柑营,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎村视,沒想到半個月后官套,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚁孔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年奶赔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杠氢。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡站刑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鼻百,到底是詐尸還是另有隱情绞旅,我是刑警寧澤摆尝,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站因悲,受9級特大地震影響堕汞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晃琳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一讯检、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卫旱,春花似錦人灼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至暴构,卻和暖如春跪呈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背取逾。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苹支,地道東北人砾隅。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像债蜜,于是被迫代替她去往敵國和親晴埂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容