SQL 将具有开始和结束日期的条目合并到具有单一日期的条目
SQL merge entries with start and end dates to entries with single dates
我有两个 table,我们称它们为 A 和 B。Table A 有关于特定事件的数据,并且有一个唯一的键列对 event_date
和 person
. Table B 具有一段时间内的聚合数据,因此具有键列 start_date
、end_date
和 person
。 table B 中的日期范围对于给定的人永远不会重叠,因此 end_date
对于复合键来说并不是绝对必要的。
下面是两个例子
SELECT event_date, person
FROM A
event_date
person
2021-10-01
Alice
2021-10-01
Bob
2021-10-05
Bob
2021-11-05
Bob
SELECT start_date, end_date, person, attribute
FROM B
start_date
end_date
person
attribute
2021-10-01
2021-11-01
Alice
Attribute 1
2021-10-01
2021-11-01
Bob
Attribute 1
2021-11-01
2021-12-01
Bob
Attribute 2
我想把attribute
列加到table A中,合并要考虑event_date
列属于哪个日期范围,选择合适的属性。合并后的最终 table 应该是这样的:
event_date
person
attribute
2021-10-01
Alice
Attribute 1
2021-10-01
Bob
Attribute 1
2021-10-05
Bob
Attribute 1
2021-11-05
Bob
Attribute 2
如何解决这个问题?
您可以尝试在 BETWEEN
日期前 JOIN
。
SELECT a.*,b.attribute
FROM A a
JOIN B b
ON a.event_date BETWEEN b.start_date AND b.end_date
AND a.person = b.person
我有两个 table,我们称它们为 A 和 B。Table A 有关于特定事件的数据,并且有一个唯一的键列对 event_date
和 person
. Table B 具有一段时间内的聚合数据,因此具有键列 start_date
、end_date
和 person
。 table B 中的日期范围对于给定的人永远不会重叠,因此 end_date
对于复合键来说并不是绝对必要的。
下面是两个例子
SELECT event_date, person
FROM A
event_date | person |
---|---|
2021-10-01 | Alice |
2021-10-01 | Bob |
2021-10-05 | Bob |
2021-11-05 | Bob |
SELECT start_date, end_date, person, attribute
FROM B
start_date | end_date | person | attribute |
---|---|---|---|
2021-10-01 | 2021-11-01 | Alice | Attribute 1 |
2021-10-01 | 2021-11-01 | Bob | Attribute 1 |
2021-11-01 | 2021-12-01 | Bob | Attribute 2 |
我想把attribute
列加到table A中,合并要考虑event_date
列属于哪个日期范围,选择合适的属性。合并后的最终 table 应该是这样的:
event_date | person | attribute |
---|---|---|
2021-10-01 | Alice | Attribute 1 |
2021-10-01 | Bob | Attribute 1 |
2021-10-05 | Bob | Attribute 1 |
2021-11-05 | Bob | Attribute 2 |
如何解决这个问题?
您可以尝试在 BETWEEN
日期前 JOIN
。
SELECT a.*,b.attribute
FROM A a
JOIN B b
ON a.event_date BETWEEN b.start_date AND b.end_date
AND a.person = b.person