选择在SQL Server 2012中满足条件x的最大值

时间:2016-11-23 22:18:54

标签: sql sql-server

我正在尝试为网站流量构建灵活的归因模型。我是通过制作最后点击模型开始的,根据访问者在转换之前的最后一次访问,将转化归因于流量渠道。所以:

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的转换将归因于电子邮件(访问者的第三次访问将被排除在外),而访问者c的转换将归因于se(作为c&# 39;第二次和第三次访问将被排除在外。)

到目前为止我的设置方式是(其中一些看起来有点傻,因为为了简单起见,我删除了一些连接并识别信息):

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;

这为我提供了最终点击归因。 (我有一种更简单的方法可以做到这一点,但这种方式看起来并不灵活 - 我希望能够轻松更改查询以排除渠道。)我的问题是,我该怎么做才能做到这一点排除直接并将转换归因于最后一个非直接渠道?如果需要,我还希望能够排除其他渠道,以便我可以构建不同的归因模型。

感谢一百万人。

3 个答案:

答案 0 :(得分:0)

我认为有一种更简单的方法:

conversionid

这将返回非Direct的{​​{1}}的最新记录(如果有的话)。

答案 1 :(得分:0)

有点不清楚你想要什么,所以这里有一些统计例子,希望这会让你更容易理解。此部分适用于条件聚合,允许您混合和匹配,例如,无论MAX是否与VisitId相关联,都会获取最后一个非直接通道。< / p>

conversion

如果你只想排除所有频道,那么使用ROW_NUMBER和WHERE&lt;&gt; “直接”应该为你做到这一点。

答案 2 :(得分:-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