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

SQL分组统计问题:筛选含多个不同Value值的ID

SQL问题解决:筛选存在多个不同Value的ID

数据表与需求

现有数据表mytable,结构及数据如下:

ID  Value
X     1
X     1
X     2
Y     5
Y     5
Y     5
Z     3
Z     6

需求:筛选出包含1个以上不同Value值的ID,预期结果为X、Z:

ID
X
Z

原SQL的问题

你尝试的SQL逻辑存在偏差:

select ID from
(
    SELECT ID
        ,count(*) over (partition by  [Value]) as c
    FROM mytable
  ) a
  where c>1

这里的窗口函数count(*) over (partition by [Value])是统计每个Value在全表中的出现次数,而非每个ID下不同Value的数量。比如Value=1出现2次,所以X的前两行c=2;Value=2出现1次,X的第三行c=1。最终筛选c>1会得到重复的X和所有Y的记录,完全不符合需求。

正确解决方案

方案一:GROUP BY + COUNT(DISTINCT)(推荐)

这是最直接高效的写法,大部分主流数据库(MySQL、SQL Server、PostgreSQL等)都支持:

SELECT ID
FROM mytable
GROUP BY ID
HAVING COUNT(DISTINCT Value) > 1;

逻辑说明:按ID分组后,用COUNT(DISTINCT Value)统计每个ID下不同Value的数量,筛选数量大于1的ID即可。

方案二:去重后统计(兼容不支持COUNT(DISTINCT)的场景)

如果你的数据库版本不支持COUNT(DISTINCT),可以先对每个ID的Value去重,再统计数量:

SELECT ID
FROM (
    -- 先获取每个ID对应的唯一Value列表
    SELECT DISTINCT ID, Value
    FROM mytable
) t
GROUP BY ID
HAVING COUNT(Value) > 1;

逻辑说明:子查询先去除每个ID下重复的Value,再按ID分组统计剩余Value的数量,大于1的即为符合条件的ID。

内容的提问来源于stack exchange,提问作者Gys---p

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:30:50