0

只是似乎无法弄清楚这一点,尽管它看起来很简单。

Table: Attd (...short for Attendance)
Visit  Person  Status  Date
1      1       Member  2011-01-31  
2      1       Member  2011-02-05  
3      2       Member  2011-02-05  
4      3       Not     2011-01-07  
5      1       Not     2011-01-25  
6      1       Not     2011-01-20  
7      1       Not     2011-02-03  

数据属于个人对某个地点的访问,包括他们是否拥有会员资格(状态列)。

您将如何选择在某人成为会员前一周进行的访问(同一个人:状态 = 非 --> 状态 = 会员)?[上面的输出第 5 行。]

例如,第 2 个人在之前没有访问过就成为了成员,因为他们在加入之前没有 Status=Not。

第 3 个人作为非会员访问过并且再也没有回来。

并且,个人 1 以非会员身份访问(状态=2011 年 1 月 25 日没有)并在一周内成为会员(状态=2011 年 1 月 31 日的会员)。

前期工作:
A. 很确定答案包含一个自加入
b。dateAdd 函数帮助满足前一周条件

4

2 回答 2

1

试试这个简单的查询:

SELECT t1.Person
FROM
  (SELECT *
   FROM attd
   WHERE status = 'member')T1
INNER JOIN
  (SELECT *
   FROM attd
   WHERE status = 'not')T2 ON T1.Person = T2.Person
WHERE datediff(dd,T2.Date,T1.Date)<=7

您可以在SQLFiddle上找到一个工作示例。

希望这对您有所帮助,如果您有任何问题,请随时与我联系。

于 2013-07-28T13:29:01.707 回答
0

首先使用聚合计算每个人的成员日期。这大概是状态为 的最短日期'Member'。然后加入到表中以获得更早的访问:

select *
from (select a.person, min(date) as MemberDate
      from Attendance a
      where status = 'Member'
      group by a.person
     ) m join
     Attendance aprev
     on m.person = aprev.person and
        datediff(d, aprev.date, MemberDate) <= 7 and
        aprev.status = 'Not';

严格来说最后一个条件'aprev.status = 'Not'是不必要的,因为这些是会员日期之前的唯一状态。但是,我认为它阐明了查询的意图。

于 2013-07-28T13:23:47.900 回答