如果具有该 ID 的任何记录满足两个条件,则排除该 ID 的所有记录

Posted

技术标签:

【中文标题】如果具有该 ID 的任何记录满足两个条件,则排除该 ID 的所有记录【英文标题】:Excluding all records of the same ID if any record with that ID meets two conditions 【发布时间】:2022-01-18 03:31:58 【问题描述】:

我有一张如下所示的表格:

ID    Pet
01    Dog
01    Cat
01    Parrot
01    Guinea Pig
02    Dog
02    Guinea Pig
03    Parrot

如果一个 ID 有一只狗和一只猫,那么我想排除该 ID 的所有记录,不管他们有什么其他动物。所以我的输出表看起来像:

ID    Pet
02    Dog
02    Guinea Pig
03    Parrot

这是我尝试过的查询:

PROC SQL;
CREAT TABLE new_table AS
SELECT * from Pets a
WHERE NOT EXISTS (SELECT *
                  FROM Pets b
                  WHERE b.ID = a.ID
                  AND b.ID = "Dog"
                  AND b.ID = "Guinea Cat"));
RUN;

这似乎不起作用,实际上并没有过滤掉任何东西。

【问题讨论】:

SQL 是必需的吗?为什么? @Reeza 工作目的,不幸的是。 【参考方案1】:

这就是你想要的:

SELECT
  * 
FROM
  pets 
WHERE
  id NOT IN
  (
    SELECT
      a.id 
    FROM
      pets a 
      JOIN
        pets b 
        ON a.id = b.id 
        AND a.pet = "Dog" 
        AND b.pet = "Cat"
  )

内部 SQL 查询正在查找同时存在 pet = "Dog" 的行和 pet = "Cat" 的行的 ID。外部 SQL 正在过滤掉这些 id。

【讨论】:

【参考方案2】:

这在 PROC SQL 中很简单,因为 SAS 会自动将汇总统计信息重新合并到详细信息行中。

data have;
  input ID $ Pet $20. ;
cards;
01    Dog
01    Cat
01    Parrot
01    Guinea Pig
02    Dog
02    Guinea Pig
03    Parrot
;

proc sql;
create table want as 
  select * 
  from have
  group by id
  having not (max(pet='Dog') and max(pet='Cat')) 
  order by id,pet
;
quit;

【讨论】:

以上是关于如果具有该 ID 的任何记录满足两个条件,则排除该 ID 的所有记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询;如果子记录 = 条件则排除记录

SQL Join 一对多从满足条件的相同键值组中提取值

如果满足 COUNT 条件,我可以应用 WHERE 子句吗?

如果条件满足,则递减数组并打印一个值

数据库:如果任何行中的字段 X 具有值 Y,则排除“分组依据”组

MS SQL 2008/Access 2002 VBA - 检查数据库的当前记录,如果不存在则输入