Mysql 尝试查看数据点是否属于SQL上的多个日期范围之一
我有两个表格,一个是关于一系列事件的,另一个是关于事件主题的人口统计信息。人口统计数据包括受试者符合事件条件的数据范围,事件数据包含事件日期字段。每个受试者都有多个日期范围,因为受试者经常失去/重新获得资格。有些事件超出了受试者的资格期,我正在尝试向事件表中添加一列,如果事件在资格期内,则显示“0”,如果不在资格期内,则显示“1” 基本上,我的表格是这样的:Mysql 尝试查看数据点是否属于SQL上的多个日期范围之一,mysql,sql,excel,date,range,Mysql,Sql,Excel,Date,Range,我有两个表格,一个是关于一系列事件的,另一个是关于事件主题的人口统计信息。人口统计数据包括受试者符合事件条件的数据范围,事件数据包含事件日期字段。每个受试者都有多个日期范围,因为受试者经常失去/重新获得资格。有些事件超出了受试者的资格期,我正在尝试向事件表中添加一列,如果事件在资格期内,则显示“0”,如果不在资格期内,则显示“1” 基本上,我的表格是这样的: Events Subject Date of Event A 1/1/20
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语句,如果事件日期在开始日期之前或结束日期之后,则返回“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脚本中肯定有这样做的方法吗?在给事件日期赋值之前,有没有办法通过多个范围检查事件日期?或者在结束时删除重复事件,但有条件地基于指定的值
编辑:
很抱歉,我在第一个问题中解释我的情况时做得很糟糕。我上面显示的第二个表是我现在得到的结果,而不是我想要的结果。我遇到的问题是,在这个数据集中,一个受试者可能有几个事件和几个不同的合格期,我需要检查每个事件,看看它是否在这些合格期内。这是一个庞大的数据集,所以我更愿意为每个事件获得一个结果,告诉我它是否属于任何受试者的资格窗口。目前,每个事件与受试者的每个合格期配对,如果事件在该数据点与其配对的合格期内,则值为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结果并不完美,但我想有一种方法可以在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
输出:
+---------+------------+------------+------------+-------+
| subject | date | start | end | value |
+---------+------------+------------+------------+-------+
| A | 2012-01-01 | 2012-01-01 | 2012-01-15 | 1 |
| A | 2012-03-04 | 2012-01-01 | 2012-01-15 | 0 |
| A | 2012-01-01 | 2012-03-01 | 2012-03-31 | 0 |
| A | 2012-03-04 | 2012-03-01 | 2012-03-31 | 1 |
| B | 2012-02-02 | 2012-02-01 | 2012-02-29 | 1 |
| B | 2012-03-04 | 2012-02-01 | 2012-02-29 | 0 |
| B | 2012-02-02 | 2012-04-01 | 2012-04-30 | 0 |
| B | 2012-03-04 | 2012-04-01 | 2012-04-30 | 0 |
+---------+------------+------------+------------+-------+
+---------+------------+------------+------------+-------+
|主题|日期|开始|结束|值|
+---------+------------+------------+------------+-------+
|A | 2012-01-01 | 2012-01-01 | 2012-01-15 | 1|
|A | 2012-03-04 | 2012-01-01 | 2012-01-15 | 0|
|A | 2012-01-01 | 2012-03-01 | 2012-03-31 | 0|
|A | 2012-03-04 | 2012-03-01 | 2012-03-31 | 1|
|B | 2012-02-02 | 2012-02-01 | 2012-02-29 | 1|
|B | 2012-03-04 | 2012-02-01 | 2012-02-29 | 0|
|B | 2012-02-02 | 2012-04-01 | 2012-04-30 | 0|
|B | 2012-03-04 | 2012-04-01 | 2012-04-30 | 0|
+---------+------------+------------+------------+-------+
这里是演示我的猜测是,对于每个主题/事件,您都想知道主题是否有人口统计数据。如果是这样,那么您需要执行
左联接
:
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;
请根据您的数据样本提供最终结果。有帮助吗?你需要更多的帮助来回答你的问题吗?这就是我之前所做的,我已经澄清了这个问题,所以我想要的结果更加清晰。谢谢你的帮助准确地说,第一个答案正是我在做的。