我正在尝试加入2张桌子。表1包含ID,日期列和值列。表2还具有ID,日期列和不同的值列。
我需要通过相同的记录ID将表1(左侧)与表2(右侧)进行连接,并通过表1中小于2的最短小于日期的日期来联接表2中的日期。因此,联接将首先匹配ID,然后将其匹配将为表2中的日期寻找表1中最短的日期。因此,如果表1中没有对应的ID的日期小于表2中的日期,那么将不为表2添加值ID。
我想显示表1中的所有记录,只显示表2中的value列。因此,如果表1中有100,000行,那么我希望最终的Joined Table也有100,000行。
这是我希望实现的简化版本和示例。在简化示例中,表2中只有1个值列,但我有15个。
这是创建虚拟表的SQL代码:
drop table if exists table1;
drop table if exists table2;
create table table1 (id text, date date, val int);
create table table2 (id text, date date, val int);
insert into table1 (id, date, val)
values ('sn1', '2010/01/26', 10),
('sn1', '2010/01/25', 9),
('sn1', '2010/01/21', 8),
('sn2', '2010/01/23', 9),
('sn2', '2010/01/22', 7),
('sn1', '2010/01/19', 10);
insert into table1 (id, date, val) values ('sn2', '2010/01/18', 11);
select * from table1 order by 1,2;
insert into table2 (id, date, val) values ('sn1', '2010/01/26', 20);
insert into table2 (id, date, val) values ('sn2', '2010/01/23', 99);
insert into table2 (id, date, val) values ('sn2', '2010/01/17', 50);
insert into table2 (id, date, val) values ('sn2', '2010/01/21', 60);
insert into table2 (id, date, val) values ('sn1', '2010/01/20', 0);
select * from table2 order by 1,2;
下面显示了所需的结果。它具有表1中的所有列和行,以及表2中的最后一列。
+------+------------+------+------+
| id | date | val1 | val2 |
+------+------------+------+------+
| sn1 | 2010-01-19 | 10 | 0 |
| sn1 | 2010-01-21 | 8 | |
| sn1 | 2010-01-25 | 9 | |
| sn1 | 2010-01-26 | 10 | 20 |
| sn2 | 2010-01-18 | 11 | 60 |
| sn2 | 2010-01-22 | 7 | |
| sn2 | 2010-01-23 | 9 | 99 |
+------+------------+------+------+
任何帮助将不胜感激,无论是SQL(首选)还是Python。
谢谢
SELECT t1.id, t1.`date`, t1.val val1, t2.val val2
FROM table1 t1
LEFT JOIN table2 t2 ON t2.`date` >= t1.`date`
AND t2.id = t1.id
AND NOT EXISTS (SELECT NULL
FROM table1 t3
WHERE t3.`date` > t1.`date`
AND t2.`date` >= t3.`date`
AND t3.id = t1.id)
ORDER BY id, `date`;
要么
WITH
cte1 AS (SELECT id, `date`, val val1, NULL val2
FROM table1
UNION ALL
SELECT id, `date`, NULL val1, val val2
FROM table2),
cte2 AS (SELECT id,
`date`,
val1,
CASE WHEN val2 IS NULL
THEN LEAD(val2) OVER (PARTITION BY id ORDER BY `date`, val2)
ELSE val2
END val2
FROM cte1)
SELECT *
FROM cte2
WHERE val1 IS NOT NULL
ORDER BY id, `date`;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句