gpt4 book ai didi

python - SQL - 有条件地连接和替换两个表之间的值

转载 作者:行者123 更新时间:2023-12-04 09:10:02 25 4
gpt4 key购买 nike

我有两个表,其中一个保存“原始”数据,另一个保存“更新”数据。更新后的数据仅包含第一个表中行的更正,但本质上是相同的。单独存储这些数据是一项功能要求。
我想要一个具有以下条件的查询:

  • 从第一个表中选择所有行
  • 如果第二个表中有匹配的行(即当 raw_d.primary_key_col_1 = edit_d.primary_key_col_1raw_d.primary_key_col_2 = edit_d.primary_key_col_2 时),我们使用最新的(其中最新的基于第二个表中 primary_key_col_3 列的值,而不是第一个 7x10846
  • 否则我们使用第一个表中的值。

  • 注意:我在实际数据中有更多的“值”列。考虑以下玩具示例,其中我有两个表 raw_dedit_d ,它们非常相似,如下所示:
        primary_key_col_1    |    primary_key_col_2    |    value_col_1    |    value_col_2
    -------------------------+-------------------------+-------------------+-------------------
    src_1 | dest_1 | 0 | 1
    src_2 | dest_2 | 5 | 4
    src_3 | dest_3 | 2 | 2
    src_4 | dest_4 | 6 | 3
    src_5 | dest_5 | 9 | 9

    primary_key_col_1 | primary_key_col_2 | primary_key_col_3 | value_col_1 | value_col_2
    -------------------------+-------------------------+-------------------------+---------------------------------------
    src_1 | dest_1 | 2020-05-09 | 7 | 0
    src_2 | dest_2 | 2020-05-08 | 6 | 1
    src_3 | dest_3 | 2020-05-07 | 5 | 2
    src_1 | dest_1 | 2020-05-08 | 3 | 4
    src_2 | dest_2 | 2020-05-09 | 2 | 5
    预期结果如下:
        primary_key_col_1    |    primary_key_col_2    |    value_col_1    |    value_col_2
    -------------------------+-------------------------+-------------------+-------------------
    src_1 | dest_1 | 7 | 0
    src_2 | dest_2 | 2 | 5
    src_3 | dest_3 | 5 | 2
    src_4 | dest_4 | 6 | 3
    src_5 | dest_5 | 9 | 9
    我建议的解决方案是使用第二个表查询“每组最大的 n”,然后使用 Pandas 在第一个表的查询中“覆盖”行。
    第一个查询只会从第一个表中获取数据:
    SELECT * FROM raw_d
    选择“每组最大 n”的第二个查询如下:
    SELECT DISTINCT ON (primary_key_col_1, primary_key_col_2) * FROM edit_d
    ORDER BY primary_key_col_1, primary_key_col_2, primary_key_col_3 DESC;
    我计划像 Replace column values based on another dataframe python pandas - better way? 一样合并数据。
    有谁知道更好的解决方案,最好只使用 SQL?作为引用,我使用 PostgreSQL 和 Pandas 作为数据堆栈的一部分。

    最佳答案

    我建议将要求表述为:

  • 从第二个表中选择最近的行
  • 从第一个表中引入不匹配的其他行

  • 这是一个 union alldistinct on :
    (select distinct on (primary_key_col_1, primary_key_col_2) u.primary_key_col_1, u.primary_key_col_2, u.value_col_1, u.value_col_2
    from updated u
    order by primary_key_col_1, primary_key_col_2, primary_key_col_3 desc
    ) union all
    select r.primary_key_col_1, r.primary_key_col_2, r.value_col_1, r.value_col_2
    from raw r
    where not exists (select 1
    from updated u
    where u.primary_key_col_1 = r.primary_key_col_2 and
    u.primary_key_col_2 = r.primary_key_col_2
    );

    关于python - SQL - 有条件地连接和替换两个表之间的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63368963/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com