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

SQL JOIN去重:如何避免订单级折扣因多商品重复累加

解决订单级折扣在商品行重复计算的问题

当前数据

order_idproduct_idquantityamountdiscount
1a150
2a157
2b1107
3a155
3b1105
3c1155

期望数据

order_idproduct_idquantityamountdiscount
1a150
2a157
2b1100
3a155
3b1100
3c1150

解决方案

方法1:用窗口函数标记订单内首行

无需改动原有CTE结构,只需在最终查询阶段通过ROW_NUMBER()窗口函数控制折扣仅出现在每个订单的首行商品记录中:

SELECT
    order_id,
    product_id,
    quantity,
    amount,
    CASE 
        WHEN ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY product_id) = 1 
        THEN discount 
        ELSE 0 
    END AS discount
FROM your_cte_final_output;
  • PARTITION BY order_id:按订单分组,确保每个订单内的序号独立计算
  • ORDER BY product_id:可替换为你需要的排序规则(比如商品金额、加入时间),只要保证每个订单只有一行序号为1即可

方法2:提前处理订单折扣再关联商品表

如果折扣是从订单表关联而来,可以先单独提取订单级折扣数据,再和商品表关联时控制折扣展示逻辑:

WITH order_discounts AS (
    -- 提取订单级折扣
    SELECT order_id, discount FROM orders
),
product_details AS (
    -- 给每个订单内的商品添加序号
    SELECT
        order_id,
        product_id,
        quantity,
        amount,
        ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY product_id) AS row_num
    FROM order_products
)
SELECT
    pd.order_id,
    pd.product_id,
    pd.quantity,
    pd.amount,
    CASE WHEN pd.row_num = 1 THEN od.discount ELSE 0 END AS discount
FROM product_details pd
JOIN order_discounts od ON pd.order_id = od.order_id;

补充说明

如果你的CTE逻辑复杂,优先选用方法1,仅修改最终SELECT语句中的折扣列计算方式即可,最小化对原有代码的改动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:30:53