自定义加入条件。在ID上左加入并在小于日期的最近处。SQL或Python解决方案

帕夏:

我正在尝试加入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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

选择并加入自定义类型

如何为自定义日志记录解决方案正确创建性能测试?

Git合并冲突自定义自动解决方案

加入自定义对象数组

HIVE在最近的日期退出加入

如何为托管解决方案添加自定义站点地图区域/组/子区域?

实施自定义Int + Range List解决方案

如何扩展自定义解决方案Xamarin的按钮

使用自定义深度测试的深度解决方案

左加入最近的日期或Google BigQuery中的日期

如何创建自定义动态DNS解决方案?

自定义解决方案的Visual Studio配色方案

内部在一个棘手的环境中加入,更新Sql Fiddle,隔离问题,寻找解决方案?

针对C#解决方案的MSBuild(类似版本)上的自定义

无法导入Dynamics CRM 2013自定义代码验证工具解决方案

MVC 6自定义Taghelper验证-解决方案

同一解决方案的其他项目中的自定义追加程序

巴基斯坦的Chrome扩展程序自定义付款解决方案?

自定义解决方案不存在于整个重新引导中

在解决方案上使用msbuild在某些项目上调用自定义目标

自定义加入激活链接

解决方案预设的项目文件上的自定义属性

将自定义项模板添加到 Visual Studio 解决方案

如何加入 postmeta 表并使用 SQL 获取自定义字段日期之前的帖子

自定义 Visual Studio 解决方案

根据 ID 在最近的日期加入 Spark SQL

提交时Leet Code问题的Python解决方案失败但适用于自定义输入?

mongodb - 左加入条件

在 ORACLE SQL 中左加入多个条件