You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL同表INNER JOIN:基于布尔列关联数据的问题求助

PostgreSQL查询优化:按时间并排展示不同Maker的Qty值

针对你的需求,这里提供两种优化方案,同时纠正原查询中的几个问题:

原查询存在的问题

  1. 字段名不匹配:原表字段为Qty,但查询中使用了quantity,会导致字段不存在的错误;
  2. 冗余字段选择:结果不需要s.maker字段,应该移除;
  3. 布尔值处理不当:如果Maker是布尔类型,无需用字符串'true'/'false'匹配,直接使用布尔值TRUE/FALSE更规范;
  4. 别名不符合期望:需要将别名改为s.qty和b.qty以匹配目标输出。

方案1:优化后的自连接查询

如果确保每个Time下Maker=TRUE和Maker=FALSE各有一条记录,自连接是直观的方式:

SELECT
  s.Time,
  s.Qty AS "s.qty",
  b.Qty AS "b.qty"
FROM agg s
JOIN agg b ON s.Time = b.Time
WHERE s.Maker = TRUE 
  AND b.Maker = FALSE;

方案2:条件聚合(更高效)

当数据量较大或存在同一Time下多条同Maker记录时,条件聚合的性能更优,且无需自连接:

SELECT
  Time,
  MAX(CASE WHEN Maker = TRUE THEN Qty END) AS "s.qty",
  MAX(CASE WHEN Maker = FALSE THEN Qty END) AS "b.qty"
FROM agg
GROUP BY Time;

如果同一Time下同一Maker有多条记录,需要求和的话,把MAX换成SUM即可。

特殊情况处理

如果Maker字段是字符串类型(存储'true'/'false'),只需将条件中的TRUE/FALSE替换为对应的字符串即可,例如:

-- 自连接版本
WHERE s.Maker = 'true' 
  AND b.Maker = 'false';

-- 条件聚合版本
MAX(CASE WHEN Maker = 'true' THEN Qty END) AS "s.qty",
MAX(CASE WHEN Maker = 'false' THEN Qty END) AS "b.qty"

内容的提问来源于stack exchange,提问作者Johnny2x

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:10:14