如何解决基于SQL Server中的条件行分组的列值相乘
对于以上数据,我想基于对行进行分组来计算每个购买行(购买= 1)的百分比值。
计算条件为:
- 上一行的visit_time应该在购买visit_time之后的7天内。
- 具有相同访客ID的行仅应在计算中考虑。
例如,百分比值应按以下方式计算:
- 第2行Percent_val =第1行的val x第2行的val = 0.23 x 0.97 = 0.2231
- 第3行Percent_val =第1行的val x第2行的val x第3行的val = 0.23 x 0.97 x 0.55 = 0.122705
- 第4行Percent_val =第4行的val = 0.11
- 第7行Percent_val =第5行的价值x第6行的价值x第7行的价值= 0.57 x 0.16 x 0.38 = 0.034656(第4行将不被考虑,因为它的visit_time不在购买行(即第7行)的7天范围内7)
我正在使用SQL Server 2012。
预期结果将类似于以下内容:
如何在这里获得预期的结果?
生成测试数据的脚本:
CREATE TABLE [#tmp_data]
(
[visitor] INT,[visit_id] INT,[visit_time] DATETIME,[val] numeric(4,2),[purchase] BIT
);
INSERT INTO #tmp_data( visitor,visit_id,visit_time,val,purchase )
VALUES( 1,1001,'2020-01-01 10:00:00',0.23,0 ),( 1,1002,'2020-01-02 11:00:00',0.97,1 ),1003,'2020-01-02 14:00:00',0.55,( 2,2001,0.11,2002,'2020-01-07 11:00:00',0.57,2003,'2020-01-08 14:00:00',0.16,2004,'2020-01-11 14:00:00',0.38,1 );
解决方法
在SQL Server中,一个选项使用横向联接:
select t.*,x.percent_val
from #tmp_data t
cross apply (
select exp(sum(log(t1.val))) percent_val
from #tmp_data t1
where t1.visitor = t.visitor and t1.visit_time > dateadd(day,- 7,t.visit_time) and t1.visit_time <= t.visit_time
) x
where t.purchase = 1
横向连接恢复了同一位访客最近7天的访问。然后,我们使用算术来计算该值的总积(只要val
大于0
,就可以使用该值)。
visitor | visit_id | visit_time | val | purchase | percent_val ------: | -------: | :---------------------- | ---: | :------- | ----------: 1 | 1002 | 2020-01-02 11:00:00.000 | 0.97 | True | 0.2231 1 | 1003 | 2020-01-02 14:00:00.000 | 0.55 | True | 0.122705 2 | 2001 | 2020-01-01 10:00:00.000 | 0.11 | True | 0.11 2 | 2004 | 2020-01-11 14:00:00.000 | 0.38 | True | 0.034656
如果您还想处理0
值,则可以更改suquery的select
子句:
select case when min(val) = 0
then 0
else exp(sum(log(case when val > 0 then t1.val end)))
end percent_val
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。