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

PostgreSQL查询各卡种最高交易时出现transaction_id主键重复问题

SQL查询各卡种最高金额交易ID重复问题修复方案

问题根因

  • 原有SQL的核心错误是主查询未建立credit_cards信用卡表和transactions交易表的关联关系,直接对两张表做笛卡尔积运算,只要交易金额和某卡种最高金额相等,就会和该卡种强行匹配,才会出现单交易对应多个不属于自身卡种的错误结果。你猜测的IN子句跨卡种匹配只是表象,本质是缺少表关联条件。

修复方案

方案1:直接修改原有SQL

只需在主查询WHERE条件中补充两张表的关联逻辑即可,修正后代码如下:

SELECT tr.identifier, cc.type, tr.amount as max_amount
FROM credit_cards cc, transactions tr 
WHERE cc.number = tr.number -- 新增信用卡号与交易卡号的关联条件
  AND (tr.amount, cc.type) IN (
    SELECT MAX(tr.amount), cc.type   
    FROM credit_cards cc, transactions tr 
    WHERE cc.number = tr.number
    GROUP BY cc.type
  )
GROUP BY tr.identifier, cc.type;

方案2:用窗口函数优化写法(逻辑更清晰,性能更优)

用RANK()窗口函数按卡种分组对交易金额倒序排序,直接取排名第一的交易即可,天然兼容同卡种多交易并列最高的场景:

WITH card_trade_rk AS (
  SELECT 
    tr.identifier, 
    cc.type, 
    tr.amount AS max_amount,
    RANK() OVER(PARTITION BY cc.type ORDER BY tr.amount DESC) AS amount_rank
  FROM credit_cards cc
  INNER JOIN transactions tr ON cc.number = tr.number
)
SELECT identifier, type, max_amount
FROM card_trade_rk
WHERE amount_rank = 1;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:24:03