【面試題】
某游戲的某促銷(xiāo)活動(dòng),會(huì)向玩家推薦一個(gè)道具,同時(shí)會(huì)得到該道具的折扣券。折扣券無(wú)有效期,但購(gòu)買(mǎi)道具一次后失效。推薦一個(gè)新的道具,也會(huì)導(dǎo)致舊的折扣券失效。
假設(shè)道具推薦、查看、購(gòu)買(mǎi)行為記錄在了下面的“游戲道具記錄表”中,包含4個(gè)字段:時(shí)間、玩家id、行為、道具id。
表中的“行為”字段的值包括:向玩家推薦道具、玩家查看道具、玩家成功付費(fèi)購(gòu)買(mǎi)道具
數(shù)據(jù)說(shuō)明:
1)一個(gè)道具的折扣券失效后,玩家仍然可以以原價(jià)購(gòu)買(mǎi)推薦的道具
2)同一個(gè)道具不會(huì)被重復(fù)推薦
3)如果玩家使用折扣券購(gòu)買(mǎi)道具,則認(rèn)為這次推薦道具->查看道具->購(gòu)買(mǎi)道具屬于一個(gè)成功推薦過(guò)程,推薦道具->購(gòu)買(mǎi)道具(即中途缺少該道具的查看記錄)不屬于成功推薦過(guò)程。
4)玩家可以推薦前查看道具,但不會(huì)獲得折扣券
【問(wèn)題】查詢(xún)所有成功推薦過(guò)程中,該道具的第一條查看記錄。
【解題步驟】
1. 解題思路
這個(gè)業(yè)務(wù)問(wèn)題一看很復(fù)雜,遇到復(fù)雜的問(wèn)題,要想到用邏輯樹(shù)分析方法,將復(fù)雜問(wèn)題拆解為可以解決的子問(wèn)題:
1)找出所有成功推薦的記錄(成功推薦是玩家使用折扣券進(jìn)行購(gòu)買(mǎi))
2)找出成功推薦時(shí)間與對(duì)應(yīng)購(gòu)買(mǎi)時(shí)間之間的查看記錄
3)篩選出每一次成功推薦的第一條查看記錄
2. 所有成功推薦的記錄
一次成功推薦是“推薦道具->查看道具->購(gòu)買(mǎi)道具”這樣的過(guò)程。
1)獲取所有推薦道具的數(shù)據(jù)
記為表t1。
2)獲取所有購(gòu)買(mǎi)道具的數(shù)據(jù)
記為表t2。
3)獲取同一個(gè)玩家同一個(gè)道具的“推薦道具->購(gòu)買(mǎi)道具”
以“所有推薦道具的數(shù)據(jù)”為左表,使用左聯(lián)結(jié),從“所有購(gòu)買(mǎi)道具的數(shù)據(jù)”中獲取同一個(gè)玩家同一個(gè)道具的購(gòu)買(mǎi)記錄(購(gòu)買(mǎi)時(shí)間在推薦時(shí)間之后)。
由于一次推薦之后,可能存在多次購(gòu)買(mǎi)記錄,此處使用窗口函數(shù)每次推薦之后對(duì)應(yīng)的購(gòu)買(mǎi)時(shí)間順序。
查詢(xún)結(jié)果:
以上結(jié)果記為表t3。
4)對(duì)“玩家購(gòu)買(mǎi)時(shí)間順序”進(jìn)行篩選
按照成功推薦的定義,“玩家購(gòu)買(mǎi)時(shí)間順序”為1時(shí),才可能成為成功推薦。
因?yàn)?,?gòu)買(mǎi)道具一次后道具對(duì)應(yīng)的折扣券會(huì)失效。
以上結(jié)果記為表tt1。
5)得到成功推薦的記錄
上一步的結(jié)果還不是成功推薦。
因?yàn)?,如果“推薦道具時(shí)間”與“玩家購(gòu)買(mǎi)時(shí)間”之間有另外的一次推薦,這次的推薦的折扣券就失效了。
查詢(xún)出“推薦道具時(shí)間”與“玩家購(gòu)買(mǎi)時(shí)間”之間沒(méi)有其他推薦的記錄。
以上結(jié)果記為數(shù)據(jù)a1。
3. 獲取成功推薦中的查看記錄
1)獲取所有查看道具的數(shù)據(jù)
記為表a2。
2)獲取成功推薦記錄中“推薦道具時(shí)間”與“玩家購(gòu)買(mǎi)時(shí)間”之間的所有查看記錄
同時(shí),用窗口函數(shù)row_number()獲取了“查看時(shí)間順序”。
以上結(jié)果記為a3。
4. 獲取成功推薦中的第一條查看記錄
最后,篩選出第一次查看的記錄,并恢復(fù)成初始的數(shù)據(jù)結(jié)構(gòu)。
將子查詢(xún)代入:
【本題考點(diǎn)】
1)考查對(duì)窗口函數(shù)的了解;
2)考查對(duì)多表聯(lián)結(jié)的了解。