按日期范围联接两个表

时间:2018-07-11 19:00:11

标签: sql date amazon-redshift

我有两个要按日期加入的表:

表1:参考

| date           |
| -------------- |
| 2018-01-01     |
| 2018-01-02     |
| 2018-01-03     |
| 2018-01-04     |
| 2018-01-05     |
| 2018-01-06     |
| 2018-01-07     |
| 2018-01-08     |
| 2018-01-09     |
| 2018-01-10     |

表2:事件

| id | date       |
| -- | ---------- |
| aa | 2018-01-03 |
| bb | 2018-01-05 |
| cc | 2018-01-08 |

我希望通过日期字段将两者结合起来,以达到以下结果:

| 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 |

即,对于每个事件ID,参考日期都从该ID的最早事件日期开始,到下一个ID出现时结束。(我希望我能很好地解释这一点)。

如果我只有一个事件和一个日期,下面的代码将起作用。但是,由于有多个事件和开始日期,它分崩离析。

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

2 个答案:

答案 0 :(得分:1)

如果您有权使用窗口功能和CTE,则只需使用LEAD

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)

答案 1 :(得分:0)

使用相关子查询:

<link rel="stylesheet" href="{{ "/assets/main.css" | relative_url }}">

请注意,这使用ANSI标准语法。返回单行的语法可能因数据库而异。

许多数据库还支持横向联接和/或<?php //Location function Location($JobID) { $db = mysqli_connect('localhost','root','******','testdb1') or die('Error connecting to MySQL server.'); $JobID = $_POST['JobID']; $getinfo = "SELECT Location FROM Jobs WHERE JobID = '$JobID'"; $query = mysqli_query($db, $getinfo); $row = mysqli_fetch_array($query); $Location = $row['Location']; echo "<img src='Floormap/$Location'>"; } ?> ,从而简化了子查询。