Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 尝试查看数据点是否属于SQL上的多个日期范围之一_Mysql_Sql_Excel_Date_Range - Fatal编程技术网

Mysql 尝试查看数据点是否属于SQL上的多个日期范围之一

Mysql 尝试查看数据点是否属于SQL上的多个日期范围之一,mysql,sql,excel,date,range,Mysql,Sql,Excel,Date,Range,我有两个表格,一个是关于一系列事件的,另一个是关于事件主题的人口统计信息。人口统计数据包括受试者符合事件条件的数据范围,事件数据包含事件日期字段。每个受试者都有多个日期范围,因为受试者经常失去/重新获得资格。有些事件超出了受试者的资格期,我正在尝试向事件表中添加一列,如果事件在资格期内,则显示“0”,如果不在资格期内,则显示“1” 基本上,我的表格是这样的: Events Subject Date of Event A 1/1/20

我有两个表格,一个是关于一系列事件的,另一个是关于事件主题的人口统计信息。人口统计数据包括受试者符合事件条件的数据范围,事件数据包含事件日期字段。每个受试者都有多个日期范围,因为受试者经常失去/重新获得资格。有些事件超出了受试者的资格期,我正在尝试向事件表中添加一列,如果事件在资格期内,则显示“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语句,如果事件日期在开始日期之前或结束日期之后,则返回“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;

请根据您的数据样本提供最终结果。有帮助吗?你需要更多的帮助来回答你的问题吗?这就是我之前所做的,我已经澄清了这个问题,所以我想要的结果更加清晰。谢谢你的帮助准确地说,第一个答案正是我在做的。