2016-11-23 86 views
0

我正在嘗試爲網站流量構建靈活的歸因模型。我開始製作最後一次點擊模式,根據訪問者在轉換前最後一次訪問的情況將轉化歸因於流量渠道。所以:在SQL Server 2012中選擇滿足條件x的最大值

Visitor  Visit  Channel ConversionId 
visitor a visit 1 email 123 
visitor a visit 2 email 123 
visitor a visit 3 direct 123 
visitor b visit 1 seo  123 
visitor b visit 2 direct 123 
visitor b visit 3 email 123 
visitor c visit 1 seo  123 
visitor c visit 2 direct 123 
visitor c visit 3 direct 123 

在上面的例子中,我會計算每個訪問者的最終訪問並將轉換歸因於該頻道。因此,訪問者a和訪問者c的轉化將歸因於直接,而訪問者b則歸因於電子郵件。

現在我希望能夠排除direct,並因此能夠將轉換歸因於最後一個非直接渠道。在這種情況下,訪客a和訪客b的轉化將歸因於電子郵件(訪客a的第三次訪問將被排除),而訪客c的轉化將歸因於se(因爲c的第二次和第三次訪問將被排除)。

我有這個成立至今的方式是(和一些這看上去有點愚蠢,因爲我剝奪了一些連接和識別的簡單信息出來):

WITH test (visitor, 
      visit, --a number unique for each visitor row but not necessarily unique across all visits 
      channel, 
      conversionid, 
      rn) AS 
(
SELECT visitorid AS visitor, 
     visitid AS visit, 
     channel AS channel, 
     conversionid AS conversionid 
     rn = ROW_NUMBER() OVER (PARTITION BY conversionid ORDER BY visit DESC) 
FROM db 
GROUP BY visitorid, 
     visitid, 
     channel, 
     conversionid) 

SELECT visitor, 
     MAX(visit) AS maxvisit, 
    channel, 
    conversionid 
FROM test 
WHERE rn = 1 
GROUP BY visitor, 
     channel 
ORDER BY visitor; 

這給了我最後點擊歸屬。 (對於我來說,這樣做有一個更簡單的方法,但這種方式看起來並不靈活 - 我希望能夠輕鬆地更改查詢以排除渠道。)我的問題是,我該怎麼做才能排除直接並將轉化歸因於最後一個非直接渠道?如果需要,我還希望能夠排除其他渠道,以便我可以構建不同的歸因模型。

感謝一百萬人。

+0

什麼,如果直接是用戶的唯一渠道是否要排除該用戶的所有在一起嗎? – Matt

+0

加我看過你的代碼和你的示例數據,並沒有太多的區別。我可能會建議給我們一個例子,因爲它更直接地與您的代碼相關,然後向我們呈現您期望的輸出。例如,MAX(visit)似乎無論通道如何都會獲得Last VisitId。行號也是如此......所以你需要MAX(VisitId),然後MAX(VisitId)的Channel不是直接的,或者簡單地MAX(VisitId,不是直接的)和該id的頻道? – Matt

+0

有沒有什麼原因讓你不要簡單地添加「WHERE頻道<>'直接'」? –

回答

0

這是有點不清楚你想要什麼,所以這裏有一些統計的例子,希望能讓你更容易理解。本節面向條件聚合,它允許您進行混合和匹配,例如採取MAXVisitId,而不管相關聯的conversion,並獲得最後一個非直接的通道。

DECLARE @Table AS TABLE (visitor CHAR(1), VisitId INT, ConversionId INT, Channel VARCHAR(15)) 
INSERT INTO @Table VALUES ('a',1, 11,'email'),('a',2, 12,'email'),('a',3, 13,'direct') 
,('b',4, 14,'seo'),('b',5, 15,'direct'),('b',6, 16,'email'),('c',7, 17,'seo') 
,('c',8, 18,'direct'),('c',9, 19,'direct') 

    ;WITH cte AS (
     SELECT 
      visitor 
      ,VisitId 
      ,Channel 
      ,ConversionId 
      ,DirectConversion = CASE WHEN Channel = 'direct' THEN ConversionId END 
      ,ChannelRowNumber = ROW_NUMBER() OVER (PARTITION BY visitor 
       ORDER BY 
       CASE WHEN Channel = 'direct' THEN 1 ELSE 0 END 
       ,ConversionId DESC) 

     FROM 
      @Table 
    ) 

    SELECT 
     visitor 
     ,MaxVisitId = MAX(VisitId) 
     ,MaxVisitIdOfNonDirect = MAX(CASE WHEN DirectConversion IS NULL THEN VisitId END) 
     ,NumOfVisits = COUNT(DISTINCT VisitId) 
     ,Channel = MAX(CASE WHEN ChannelRowNumber = 1 THEN Channel END) 
     ,NumOfConversions = COUNT(DISTINCT ConversionId) 
     ,NumOfDirectConversions = COUNT(DISTINCT DirectConversion) 
     ,NumOfNonDirectConversions = COUNT(DISTINCT ConversionId) - COUNT(DISTINCT DirectConversion) 
    FROM 
     cte 
    GROUP BY 
     visitor 

如果你只是想排除頻道一起,然後使用ROW_NUMBER和WHERE <>「直接」應該爲你做的伎倆。

+0

哦,我認爲這就是它!我需要更多的時間來驗證,因爲我今天在這裏已經持續了很長時間,需要休息一下,但我認爲你已經明確了它。 你能向我解釋這是如何工作的嗎?谷歌搜索「條件聚合」爲我奠定了嗎? – mowshowitz

+0

@mowshowitz是啊使用google搜索它可能會爲你打好它,但想法是你在聚合函數內創建case表達式或iif,以便案例將有你不想計算,sum,max等的空值。所以當應用聚合時,它只是計算你想要的值。因此,在這種情況下,您可以過濾出直接值並僅彙總其他值。 – Matt

+1

精彩,非常感謝。 – mowshowitz

0

我認爲有一個簡單的方法:

SELECT db.* 
FROM (SELECT db.*, 
      ROW_NUMBER() OVER (PARTITION BY conversionid 
           ORDER BY (CASE WHEN channel <> 'Direct' THEN 1 ELSE 2 END), 
             visit DESC 
           ) as seqnum 
     FROM db 
    ) db 
WHERE seqnum = 1; 

這將返回最新記錄每個conversionid不是Direct,如果有一個。

+0

看起來像惡意的多重匿名downvoting。 –

-1

在SQL Server下面的代碼是值得嘗試

select visitor,channel,conversionid, 
dense_rank() over(partition by visitor order by visit desc) as rn 
into #visitor 
from visitor 
where channel <> 'Direct' 
order by visitor,visit 

select v1.visitor,count(v2.visit) as visits ,v1.channel,v1.conversionid 
from #visitor v1 join visitor v2 
on v1.visitor=v2.visitor and v1.rn=1 
group by v1.visitor,v1.channel,v1.conversionid 
相關問題