您将如何编写支持事件研究分析的T-SQL查询

时间:2016-05-28 10:43:40

标签: sql-server tsql

我试图创建一个支持简单事件研究分析的表,但我不确定如何最好地处理这个问题。

我想创建一个包含以下列的表:客户,日期,网站上的时间,结果。我正在测试一个特定客户在任何一天的结果的前提,如果当天在网站上花费的时间以及前五次网站访问的话。我正在设想一个类似于此的表:

[1]: http://i.stack.imgur.com/yZ98l.png

我希望编写一个T-SQL查询,它将生成如下输出:

enter image description here

鉴于此目标,以下是我的问题:

  • 假设这确实可行,我应该如何构建我的表来实现这个目标?是否需要一个引用先前访问的列?我是否需要为特定列添加索引?

  • 这会被视为递归查询吗?

  • 根据适当的表结构,查询会是什么样的?

  • 是否可以使用一个变量来构造查询,该变量确定除当前周期之外要包括的先前周期数(例如,如果我想比较5个周期到3个周期)?

2 个答案:

答案 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