亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自定義加入條件。左加入 ID 和最近的小于日期。SQL 或 Python 解決方案

自定義加入條件。左加入 ID 和最近的小于日期。SQL 或 Python 解決方案

Helenr 2023-06-20 16:42:26
我正在嘗試加入 2 個表。表 1 包含 Id、日期列和值列。表 2 還有 Id、日期列和不同的值列。我需要通過相同的記錄 ID 和表 1 中最接近的小于表 2 中日期的日期將表 1(如左圖)與表 2(右圖)連接起來。因此,連接將首先匹配 ID,然后匹配它將為表 2 中的日期查找表 1 中最接近的小于日期。因此,如果表 1 中沒有小于表 2 的相應 ID 的日期,則不會添加表 2 的值,因為ID。我想顯示表 1 中的所有記錄,并且只顯示表 2 中的值列。因此,如果表 1 中有 100,000 行,那么我希望最終的聯接表也有 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。
查看完整描述

1 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

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

小提琴


查看完整回答
反對 回復 2023-06-20
  • 1 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號