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

如何用SQL筛选拥有多个不同prd_id的cust_id并优化代码?

SQL代码优化与修正

原代码的问题

  • 语法错误:连续写了两个独立的where子句,不符合SQL语法规范
  • 逻辑缺失:exists子查询未与主表的cust_id建立关联,无法精准筛选出目标客户
  • 条件偏差:having count(*) >=1仅筛选出至少拥有一个指定产品的客户,无法满足“拥有多个不同prd_id”的需求

优化后的简洁写法

方法1:使用窗口函数(推荐,代码简洁且效率较高)

SELECT DISTINCT cust_id, prd_id
FROM (
    SELECT 
        cust_id, 
        prd_id,
        -- 统计每个客户拥有的不同产品数量
        COUNT(DISTINCT prd_id) OVER (PARTITION BY cust_id) AS prd_count
    FROM acct_tbl
    WHERE prd_id IN ('prdA','prdB','prdC')
) t
-- 只保留拥有2个及以上不同产品的客户记录
WHERE prd_count >= 2;

方法2:先筛选目标客户再关联

SELECT a.cust_id, a.prd_id
FROM acct_tbl a
-- 先找出符合条件的客户
JOIN (
    SELECT cust_id
    FROM acct_tbl
    WHERE prd_id IN ('prdA','prdB','prdC')
    GROUP BY cust_id
    -- 统计不同产品数量≥2的客户
    HAVING COUNT(DISTINCT prd_id) >= 2
) b ON a.cust_id = b.cust_id
WHERE a.prd_id IN ('prdA','prdB','prdC');

关键说明

  • 必须用COUNT(DISTINCT prd_id),避免同一客户同一产品对应多个账号时的计数错误
  • 两种方法都先限定了产品范围,仅处理指定的prdA/prdB/prdC
  • 窗口函数写法无需额外关联,代码更清爽;关联写法在部分数据库中性能表现更优,可根据实际场景选择

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:46:10