你好呀,汪同学! 2023-05-06 13:49 采纳率: 82.1%
浏览 12
已结题

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值

  • 写回答

1条回答 默认 最新

  • Leodong. 2023-05-06 13:56
    关注

    该回答通过自己思路及引用到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 函数。


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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 已采纳回答 5月6日
  • 创建了问题 5月6日