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

查询列值相同的所有行:SQL分组查询返回结果不符求助

解决GROUP BY仅返回单条记录,需获取全组所有行的问题

你的问题根源在于**GROUP BY本身的作用是分组聚合**——它会把相同branch_address的行合并成一行,并用聚合函数(比如COUNT(*))计算组内的统计值,所以自然只能返回每组一条记录。而你需要的是找出所有属于那些刚好有10条记录的branch_address组的行,而不是组的统计结果。

这里有两种常用的解决方法:

方法一:使用子查询筛选符合条件的branch_address

先通过子查询找出满足COUNT(*)=10的branch_address,再将这个结果和原关联表进行匹配,获取所有对应的行:

SELECT t1.auction_id, t1.account_no, t1.branch_address
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.aul_id = t2.aul_id
WHERE t2.date = '2018-03-20'
AND t1.branch_address IN (
    -- 子查询找出刚好有10条记录的branch_address
    SELECT t1_inner.branch_address
    FROM Table1 t1_inner
    LEFT JOIN Table2 t2_inner ON t1_inner.aul_id = t2_inner.aul_id
    WHERE t2_inner.date = '2018-03-20'
    GROUP BY t1_inner.branch_address
    HAVING COUNT(*) = 10
);

方法二:使用窗口函数(更高效,推荐)

窗口函数可以在不分组聚合的前提下,计算每个branch_address组内的记录数,然后筛选出组内记录数等于10的行:

SELECT auction_id, account_no, branch_address
FROM (
    SELECT 
        t1.auction_id, 
        t1.account_no, 
        t1.branch_address,
        -- 计算当前branch_address组内的总记录数
        COUNT(*) OVER (PARTITION BY t1.branch_address) AS group_count
    FROM Table1 t1
    LEFT JOIN Table2 t2 ON t1.aul_id = t2.aul_id
    WHERE t2.date = '2018-03-20'
) AS subquery
WHERE group_count = 10;

注意点:

  • 窗口函数COUNT(*) OVER (PARTITION BY ...)会为每一行标记其所在组的总记录数,不会改变原行的数量,这样就能轻松筛选出符合组大小条件的所有行。
  • 如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),优先使用方法二,因为它只需要扫描一次表,性能比子查询更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:59:41