我试图创建一个支持简单事件研究分析的表,但我不确定如何最好地处理这个问题。
我想创建一个包含以下列的表:客户,日期,网站上的时间,结果。我正在测试一个特定客户在任何一天的结果的前提,如果当天在网站上花费的时间以及前五次网站访问的话。我正在设想一个类似于此的表:
我希望编写一个T-SQL查询,它将生成如下输出:
鉴于此目标,以下是我的问题:
假设这确实可行,我应该如何构建我的表来实现这个目标?是否需要一个引用先前访问的列?我是否需要为特定列添加索引?
这会被视为递归查询吗?
根据适当的表结构,查询会是什么样的?
是否可以使用一个变量来构造查询,该变量确定除当前周期之外要包括的先前周期数(例如,如果我想比较5个周期到3个周期)?
答案 0 :(得分:1)
对于固定列,您可以使用lag:
这样做select
time,
lag(time, 1) over (partition by customer order by date desc),
lag(time, 2) over (partition by customer order by date desc),
lag(time, 3) over (partition by customer order by date desc),
lag(time, 4) over (partition by customer order by date desc)
from
yourtable
如果您需要动态列,则必须使用动态SQL构建它。
答案 1 :(得分:1)
不确定我理解矩阵的分析值
Declare @Table table (id int,VisitDate date,VisitTime int,Outcome varchar(25))
Insert Into @Table (id,VisitDate,VisitTime,Outcome) values
(123,'2015-12-01',100,'P'),
(123,'2016-01-01',101,'P'),
(123,'2016-02-01',102,'N'),
(123,'2016-03-01',100,'P'),
(123,'2016-04-01', 99,'N'),
(123,'2016-04-09', 98,'P'),
(123,'2016-05-09', 99,'P'),
(123,'2016-05-14',100,'N'),
(123,'2016-06-13', 99,'P'),
(123,'2016-06-15', 98,'P')
Select *
,T0 = VisitTime
,T1 = Lead(VisitTime,1,0) over(Partition By ID Order By ID,VisitDate Desc)
,T2 = Lead(VisitTime,2,0) over(Partition By ID Order By ID,VisitDate Desc)
,T3 = Lead(VisitTime,3,0) over(Partition By ID Order By ID,VisitDate Desc)
,T4 = Lead(VisitTime,4,0) over(Partition By ID Order By ID,VisitDate Desc)
,T5 = Lead(VisitTime,5,0) over(Partition By ID Order By ID,VisitDate Desc)
From @Table
Order By ID,VisitDate Desc
返回
id VisitDate VisitTime Outcome T0 T1 T2 T3 T4 T5
123 2016-06-15 98 P 98 99 100 99 98 99
123 2016-06-13 99 P 99 100 99 98 99 100
123 2016-05-14 100 N 100 99 98 99 100 102
123 2016-05-09 99 P 99 98 99 100 102 101
123 2016-04-09 98 P 98 99 100 102 101 100
123 2016-04-01 99 N 99 100 102 101 100 0
123 2016-03-01 100 P 100 102 101 100 0 0
123 2016-02-01 102 N 102 101 100 0 0 0
123 2016-01-01 101 P 101 100 0 0 0 0
123 2015-12-01 100 P 100 0 0 0 0 0