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

如何在MariaDB中查询各scope去重公司数及全局总公司数

解决方案

MariaDB 10.5之前的版本不支持在窗口函数中使用COUNT(DISTINCT)语法,这是此前用OVER()+PARTITION BY实现失败的常见原因。下面给出两种兼容不同版本的实现方案,假设你的表名为your_table:

方案1:兼容所有MariaDB版本(子查询关联实现)

SELECT 
  t.scopeID,
  COUNT(DISTINCT t.companyID) AS scope_company_cnt,
  g.total_company_cnt
FROM your_table t
CROSS JOIN (
  SELECT COUNT(DISTINCT companyID) AS total_company_cnt FROM your_table
) g
GROUP BY t.scopeID, g.total_company_cnt;

该写法先用子查询算出全局去重的companyID总数,再和按scopeID分组统计的结果做笛卡尔关联,即可让每一行都带上全局总数,所有版本的MariaDB都支持,性能稳定。

方案2:MariaDB 10.5及以上版本(窗口函数实现)

如果你的数据库版本 >=10.5,支持窗口函数的distinct计数,可以用更简洁的写法:

SELECT 
  scopeID,
  COUNT(DISTINCT companyID) AS scope_company_cnt,
  MAX(total_company_cnt) AS total_company_cnt
FROM (
  SELECT 
    scopeID,
    companyID,
    COUNT(DISTINCT companyID) OVER() AS total_company_cnt
  FROM your_table
) t
GROUP BY scopeID;

内层查询先用窗口函数算出全局去重的companyID总数,外层按scopeID分组统计每个scope下的去重公司数,用MAX取全局总数(每行的全局总数一致,用MAX/MIN/ANY_VALUE都可)即可。

示例验证参考:
输入数据:

IDcompanyIDscopeID
11001
22001
31002
43002
52003

两种方案输出结果均为:

scopeIDscope_company_cnttotal_company_cnt
123
223
313

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:18:04