尝试查看数据点是否在SQL的多个date范围之一内

我有两张桌子,一张桌子上有一系列的事件,另一张上面有关于事件主题的人口统计信息。 人口统计数据包括对象有资格参加事件的数据范围,并且事件数据包含具有事件date的字段。 每个科目有多个date范围,因为科目经常失去/重新获得资格。 有些事件不属于主题的资格期限,我正在尝试向事件表添加一个列,如果事件处于资格阶段,则显示“0”,否则显示“1”。

基本上,我的桌子是这样的:

Events Subject Date of Event A 1/1/2012 A 3/4/2012 B 2/2/2012 B 3/4/2012 Demographics Subject Start End A 1/1/2012 1/15/2012 A 3/1/2012 3/31/2012 B 2/1/2012 2/29/2012 B 4/1/2012 4/30/2012 

我运行一个简单的CASE WHEN语句,如果事件date在开始date之前或结束date之后,则返回“0”,否则返回“1”。 结果是:

  Subject Date of Event Start End Value A 1/1/2012 1/1/2012 1/15/2012 1 A 1/1/2012 3/1/2012 3/31/2012 0 A 3/4/2012 1/1/2012 1/15/2012 0 A 3/4/2012 3/1/2012 3/31/2012 1 B 2/2/2012 2/1/2012 2/29/2012 1 B 2/2/2012 4/1/2012 4/30/2012 0 B 3/4/2012 2/1/2012 2/29/2012 0 B 3/4/2012 4/1/2012 4/30/2012 0 

我可以把这些结果导出到Excel中,然后用另一个事件标识符做一个VLOOKUP,这个标识符会给我所需要的最终结果,但是在我的SQL脚本中肯定有办法做到这一点? 有没有办法在分配一个值之前通过多个范围检查事件date? 或者在最后删除重复的事件,但有条件的基础上分配的值?

编辑:

我很抱歉,在最初的问题中,我做了一个糟糕的工作来解释我的情况。 我上面显示的第二个表是我现在得到的结果,而不是我想要的结果。 我遇到的问题是,在这个数据集中,一个主题可能有几个事件和几个不同的资格期限,我需要检查每个事件是否属于这些资格期限。 这是一个庞大的数据集,所以我希望每个事件都能得到一个结果,告诉我它是否属于任何主题的资格窗口。 目前,每个事件都会与每个对象的资格周期配对,如果该事件属于与该数据点配对的资格期限内,则该值为1。 所以我理想的输出将是真正的:

  Subject Date of event Value A 1/1/2012 1 A 3/1/2012 1 B 2/2/2012 1 B 3/4/2012 0 

就像我说的,我可以通过在Excel中使用VLOOKUP来获取这个结果,但是我想现在有一个方法可以在SQL中获得这个结果。

试试这种方式

 SELECT e.subject, e.date, d.start, d.end, (e.date BETWEEN d.start AND d.end) value FROM events e JOIN demographics d ON e.subject = d.subject 

输出:

 + --------- + ------------ + ------------ + ------------ + ------- +
 | 主题| date| 开始| 结束| 值|
 + --------- + ------------ + ------------ + ------------ + ------- +
 |  A |  2012-01-01 |  2012-01-01 |  2012-01-15 |  1 |
 |  A |  |  2012-01-01 |  2012-01-15 |  0 |
 |  A |  2012-01-01 |  |  |  0 |
 |  A |  |  |  |  1 |
 |  B |  |  2012-02-01 |  2012-02-29 |  1 |
 |  B |  |  2012-02-01 |  2012-02-29 |  0 |
 |  B |  |  |  |  0 |
 |  B |  |  |  |  0 |
 + --------- + ------------ + ------------ + ------------ + ------- +

这里是SQLFiddle演示

我的猜测是,每个主题/事件,你想知道,如果主题有人口统计。 如果是这样,那么你想要做一个left join

 select e.subject, e.eventdate, max(d.start) as start, max(d.end as end), (max(d.subject) is not null) as value from events e left join demographics d on s.subject = d.subject and e.eventdate between d.start and d.end group by e.subject, e.eventdate;