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