【发布时间】:2023-03-24 04:15:01
【问题描述】:
我有两张表,一张保存“原始”数据,另一张保存“更新”数据。更新后的数据只包含对第一个表中行的更正,但本质上是相同的。单独存储这些数据是一项功能要求。
我想要一个符合以下条件的查询:
- 从第一个表中选择所有行
- 如果第二个表中有匹配的行(即当
raw_d.primary_key_col_1 = edit_d.primary_key_col_1和raw_d.primary_key_col_2 = edit_d.primary_key_col_2时),我们使用最新的(其中最新的基于第二个表中的primary_key_col_3列的值,而不是第一个 - 否则我们使用第一个表中的值。
注意:我在实际数据中有更多“价值”列。考虑以下玩具示例,其中我有两个表,raw_d 和 edit_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 作为我的数据堆栈的一部分。
【问题讨论】:
标签: python sql database pandas postgresql