PGsql取两表对应值

kk表
A    B
a    2023/5/4
B    2023/5/3

cc表
a    2023/5/4    122
b    2023/5/2    111
b    2023/5/1    111
c    2023/5/2    122
v    2023/5/1    111

最终要的结果表
a    2023/5/4    122
b    2023/5/2    111

有A和B两个表
kk表中A列为唯一的值不重复,B为时间
cc表中A列与cc表中A列值一致但值有重复,B为时间

怎样通过kk和cc表关联,去除kk表中A B列在cc表中对应的C值,如何没有kk表中对应的时间,则取就近时间的C列值。如b由于cc表中没有对应时间的,则取就近2023-05-03的C值

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
可以使用 PostgreSQL 的 JOIN 语句和子查询完成该操作。具体步骤如下:

  1. 使用 LEFT JOIN 将 kk 表和 cc 表进行关联,关联条件为 A 列的值相等。
  2. 在 ON 子句中加入条件 B <= C,即找到 B 最接近 C 的记录。
  3. 为了去除 cc 表中的重复记录,使用子查询先找出每个 A 对应的最近的 C 值和时间。
  4. 最后对结果进行筛选,只选取 C 不为空的记录。

完整的 SQL 语句如下:

SELECT cc.A, cc.B, cc.C
FROM (
  SELECT A, MAX(B) AS B
  FROM kk
  LEFT JOIN cc ON kk.A = cc.A AND kk.B >= cc.B
  GROUP BY A
) AS t
JOIN cc ON t.A = cc.A AND t.B = cc.B 
WHERE cc.C IS NOT NULL;

这条 SQL 语句将返回一个结果集,其中包含了 kk 表中 A 和 B 列在 cc 表中对应的 C 值。如果 kk 表中没有对应的时间,则会取最接近的时间的 C 值。

需要注意的是,如果 cc 表中存在多个时间相同的记录,则该 SQL 语句将返回所有这些记录,而不是仅返回其中的一条记录。如果需要返回最近的一条记录,则可以将子查询中的 MAX 函数改为 MIN 函数。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢