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

使用PHP和SQL生成统计数据:查询客户数量最多的国家

找出客户数量最多的国家:SQL方案详解

嘿,我太懂这种“以为简单结果卡壳”的新手困境了!针对你的需求,我给你整理了两种常用的SQL方案,覆盖单结果和多并列的场景,都是实际项目里常用的:

1. 基础方案:只取第一个最多的国家(忽略并列)

如果你的场景里不需要考虑多个国家客户数相同的情况,或者只需要展示其中一个,用这个最简单的查询就够了:

SELECT country_code, COUNT(*) AS client_count
FROM CLIENTS
-- 可选:排除空的国家代码记录,避免统计无效数据
WHERE country_code IS NOT NULL
GROUP BY country_code
ORDER BY client_count DESC
LIMIT 1;

这个语句的逻辑很直观:

  • GROUP BY country_code 按国家代码分组,把同一国家的客户归到一组
  • COUNT(*) 统计每组里的客户数量,别名client_count方便后续引用
  • ORDER BY client_count DESC 按客户数量从多到少排序,让数量最多的国家排在最前面
  • LIMIT 1 只取排序后的第一条结果

2. 进阶方案:获取所有并列客户数最多的国家

如果存在多个国家客户数相同且都是最大值的情况,上面的LIMIT会漏掉其他并列的国家,这时候用窗口函数来处理更合适:

-- 第一步:统计每个国家的客户数
WITH country_counts AS (
    SELECT country_code, COUNT(*) AS client_count
    FROM CLIENTS
    WHERE country_code IS NOT NULL
    GROUP BY country_code
),
-- 第二步:给每个国家的客户数排名
ranked_countries AS (
    SELECT 
        country_code, 
        client_count,
        -- RANK()会跳过并列后的排名,比如两个第一后直接是第三;DENSE_RANK()则保持连续排名
        RANK() OVER (ORDER BY client_count DESC) AS country_rank
    FROM country_counts
)
-- 第三步:筛选出排名第一的所有国家
SELECT country_code, client_count
FROM ranked_countries
WHERE country_rank = 1;

这里用了RANK()窗口函数,如果你希望排名是连续的(比如两个第一后是第二),可以换成DENSE_RANK(),核心功能都是找出所有最大值对应的国家。

新手友好小提示

  • 一定要注意country_code字段的空值问题,加上WHERE country_code IS NOT NULL能避免统计到无效数据
  • 如果主页展示的统计数据不需要实时更新,可以把查询结果缓存起来(比如用内存缓存工具),或者创建一个数据库视图,减少每次页面加载时的数据库查询压力
  • 测试的时候可以手动插入几条测试数据,比如两个国家各有5个客户,看看进阶方案是否能正确返回两个结果

内容的提问来源于stack exchange,提问作者Rafael Schneider Pereira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:37:41