Sql 筛选列以查找不同的值集

Sql 筛选列以查找不同的值集,sql,postgresql,snowflake-schema,Sql,Postgresql,Snowflake Schema,我有一张有姓名、身份证和汽车的桌子 我想返回只有本田或福特的人的不同姓名和ID 如果他们有本田或福特或两者都有,这是可以的&返回值。但是,如果它们同时具有和另一个make(如下面bob的案例),则不要返回名称/ID 表: Name ID Car BOB 21112 Honda Ame 32112 Honda BOB 21112 FORD **BOB 21112 Dodge** --disqualifies bob from output Ale 12322 Ford Ame 32112

我有一张有姓名、身份证和汽车的桌子

我想返回只有本田或福特的人的不同姓名和ID

如果他们有本田或福特或两者都有,这是可以的&返回值。但是,如果它们同时具有另一个make(如下面bob的案例),则不要返回名称/ID

表:

Name ID   Car
BOB 21112 Honda  
Ame 32112 Honda 
BOB 21112 FORD
**BOB 21112 Dodge** --disqualifies bob from output
Ale 12322 Ford
Ame 32112 Ford
Sam 52412 Honda
输出:

Name ID   Car
Ame 21112 Honda, Ford   
Ale 32112 Ford 
Sam 52412 Honda
输出不一定要如上所示,只是希望为满足此条件的人员标识不同的名称和ID

我尝试了下面这样的方法,但我认为如果一个名字有其他品牌的汽车,这种方法也适用

Select t.Name, t.ID, t.Car
FROM table t
WHERE t.name = 'Honda' OR t.name = 'Ford'
我想返回只有本田或福特的人的不同姓名和身份证

我建议使用聚合:

select name, id, array_agg(car)
from t
group by name, id
having count(*) filter (where car not in ('Honda', 'Ford')) = 0;
这会将汽车列表放入一个数组中。如果需要单独的行(可能还有其他列),可以使用窗口函数:

select t.*
from (select t.*,
             count(*) filter (where name not in ('Honda', 'Ford')) over (partition by name, id) as cnt
      from t
     ) t
where cnt = 0;