Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
Sql 按日期范围联接两个表_Sql_Date_Amazon Redshift - Fatal编程技术网

Sql 按日期范围联接两个表

Sql 按日期范围联接两个表,sql,date,amazon-redshift,Sql,Date,Amazon Redshift,我希望按日期加入两个表: 表1:参考 表2:活动 我希望通过日期字段加入这两个字段,以实现以下结果: | id | reference date | event date | | -- | -------------- | ---------- | | aa | 2018-01-03 | 2018-01-03 | | aa | 2018-01-04 | 2018-01-03 | | bb | 2018-01-05 | 2018-01-05 | | bb | 2018-01

我希望按日期加入两个表:

表1:参考

表2:活动

我希望通过日期字段加入这两个字段,以实现以下结果:

| id | reference date | event date |
| -- | -------------- | ---------- |
| aa | 2018-01-03     | 2018-01-03 |
| aa | 2018-01-04     | 2018-01-03 |
| bb | 2018-01-05     | 2018-01-05 |
| bb | 2018-01-06     | 2018-01-05 |
| bb | 2018-01-07     | 2018-01-05 |
| cc | 2018-01-08     | 2018-01-08 |
| cc | 2018-01-09     | 2018-01-08 |
| cc | 2018-01-10     | 2018-01-08 |
i、 e对于每个事件id,参考日期从该id的最早事件日期开始,到下一个id生效时结束。我希望我解释得很好

如果我只有一个事件和一个日期,下面的代码可以工作。但由于有多个事件和开始日期,它就分崩离析了

select
  events.id,
  reference.date,
  events.date
from events 
join reference on
  reference.date >= events.date 

使用相关子查询:

select r.*,
       (select e.id
        from events e
        where e.date <= r.date
        order by e.date desc
        fetch first 1 row only
       ) as event_date,
       (select e.date
        from events e
        where e.date <= r.date
        order by e.date desc
        fetch first 1 row only
       ) as event_date
from reference e;
请注意,这使用ANSI标准语法。返回单行的语法可能因数据库而异


许多数据库还支持横向联接和/或交叉应用,从而简化了子查询。

如果您可以访问窗口函数和CTE,只需使用LEAD:


请标记您正在使用的数据库。使用红移希望helpsHi Salman-我可以使用红移访问窗口函数和CTE,但我收到错误消息默认参数不支持窗口函数lead我删除了NULL,它似乎在SQL Server上工作。LEAD应该为最后一行返回NULL,这是有意义的。是的-也尝试过了,它成功了!太棒了!非常感谢。戈登-这似乎是可行的,但在参考表中的前两个日期。我希望日期从事件表的第一个日期开始。我还看到相关子查询只允许一项。如果我想从events表中提取几个其他字段呢?Gordon-谢谢。使用上面的Salmans解决方案似乎更简单。非常感谢。
select
  events.id,
  reference.date,
  events.date
from events 
join reference on
  reference.date >= events.date 
select r.*,
       (select e.id
        from events e
        where e.date <= r.date
        order by e.date desc
        fetch first 1 row only
       ) as event_date,
       (select e.date
        from events e
        where e.date <= r.date
        order by e.date desc
        fetch first 1 row only
       ) as event_date
from reference e;
WITH cte AS (
    SELECT id, date, LEAD(date, 1) OVER (ORDER BY date) AS end_date
    FROM events
)
SELECT cte.id, reference.date AS reference_date, cte.date AS event_date
FROM cte
INNER JOIN reference ON reference.date >= cte.date
    AND (reference.date < cte.end_date OR cte.end_date IS NULL)