我有一個(gè)這樣的表:
<表類=“s-表”> <標(biāo)題>追蹤所有使用者的電子郵件、IP、日期/時(shí)間和事件(註冊和購買)。
現(xiàn)在,我正在嘗試對 a) 註冊和 b) 轉(zhuǎn)換進(jìn)行每日統(tǒng)計(jì)(註冊後 7 天內(nèi)發(fā)生的購買,分配給該電子郵件/IP 的初始註冊日期,而不是購買日期)。 p>
我可以輕鬆計(jì)算出a) 註冊...但試圖弄清楚如何查詢7 天內(nèi)的轉(zhuǎn)化,然後將每個(gè)註冊的轉(zhuǎn)化分配給註冊日期(而不是轉(zhuǎn)化日期,這很容易) ,事實(shí)證明這是一個(gè)相當(dāng)大的挑戰(zhàn)。
這是我迄今為止的查詢:
選擇日期(時(shí)間戳)作為日期, SUM(CASE WHEN event = '注冊' THEN 1 ELSE 0 END) AS 注冊, SUM(CASE WHEN event = '購買' THEN 1 ELSE 0 END) AS 轉(zhuǎn)化 來自點(diǎn)擊跟蹤 哪里日期(時(shí)間戳)<='2021-07-31' 和日期(時(shí)間戳)>='2021-07-01' 按日期分組 按日期排序
這給了我以下結(jié)果:
<表類=“s-表”> <標(biāo)題>我理想中需要的是這樣的(3 個(gè)購買事件與 15 日的 3 個(gè)註冊事件相關(guān)聯(lián),因此為什麼 3 個(gè)轉(zhuǎn)換被分配給 15 日,而沒有分配給 16 日):
<表類=“s-表”> <標(biāo)題>有道理嗎?
請記住,這個(gè) click_tracking 表的大小有一百萬或兩條記錄,而且我已經(jīng)多次嘗試在其自身上使用 JOINS 使其崩潰,因此並非任何查詢都可以執(zhí)行...
知道如何有效地解決這個(gè)問題並更改我的查詢來完成這個(gè)任務(wù)嗎?
您需要視窗函數(shù)來執(zhí)行此類查詢:
與組合 AS ( 選擇日期(時(shí)間戳)作為日期0, 電子郵件, FIRST_VALUE(事件) OVER(按電子郵件分區(qū) ORDER BY 當(dāng)前行和 0 個(gè)后續(xù)行之間的時(shí)間戳行) AS event1, NTH_VALUE(事件,2) OVER(按電子郵件分區(qū) ORDER BY 當(dāng)前行和后續(xù) 1 行之間的時(shí)間戳行) AS event2, FIRST_VALUE(日期(時(shí)間戳)) OVER(按電子郵件分區(qū) ORDER BY 1 PRECEDING AND 1 FOLLOWING 之間的時(shí)間戳行) AS date1, NTH_VALUE(DATE(時(shí)間戳),2) OVER(按電子郵件分區(qū) ORDER BY 1 PRECEDING AND 1 FOLLOWING 之間的時(shí)間戳行) AS date2 來自點(diǎn)擊跟蹤 WHERE 時(shí)間戳位于“2021-07-01 00:00:00”和“2021-07-30 23:59:59”之間) 選擇日期 0 作為日期, SUM(CASE WHEN event1='注冊' THEN 1 ELSE 0 END) AS 注冊, SUM(CASE WHEN event1='注冊' AND event2='購買' AND DATEDIFF(date2,date1)假設(shè)對於每封電子郵件,第一筆記錄始終是
註冊
,第二筆記錄(如果有)始終是購買
,您將獲得該電子郵件的類型和日期一次記錄前2 筆記錄。然後,您可以輕鬆地分別統(tǒng)計(jì)註冊和購買量,同時(shí)套用附加篩選條件,使 2 個(gè)事件之間的間隔不超過 7 天。如果您在
timestamp
上有一個(gè)鍵,那麼即使有 100 萬行,查詢也應(yīng)該足夠快。