根据 SQL 的条件删除结果

Removing results based on condition on SQL

数据集上下文:Table有一列SEX_CODE可以是M、F、B(已婚,所以名字是两个名字的组合)。所以一个 household_ID 可以有三个重复项,都具有不同的 SEX_CODE,并且被归类在 3 个单独的 sub_id 中。 (还有 'U'-unknown,但那些从来没有重复的 household_ID 所以我们可以忽略它们)

目标:我需要处理以下情况:

  1. 如果 household_IDSEX_CODE='M' 和 'F' return 这两行重复。

  2. 如果 household_IDSEX_CODE='B' 和 'F'/'M' 重复 然后 return 仅 'F'/'M'(或删除 'B')。

  3. 如果 household_IDSEX_CODE='B' 和 'F' 以及 'M' 重复 然后 return 只有 'F' 和 'M'(或删除 'B')。

有几个问题我 运行

  1. 我的主要查询是按 household_IDsub_ID 分组,所以如果这些行具有相同的 household_ID,我就无法吐出 2 行和 sub_ID.

  2. 我不知道如何拆分成 3 个案例。我可以使用 CASECOUNT.

  3. 分为两种情况

SQL Fiddle

我觉得我需要以一种完全不同的方式来处理它,而不是按组,但我不知道如何按案例进行分组。

我可以在 Excel 中手动删除它们(突出显示重复项>按颜色过滤>过滤 sex_code 'B'>全部删除)但查询将是 60,000 + 行,所以我想知道是否可以在 SQL 中完成。但如果这不可能,请不要担心,我会在 Excel.

中完成

假设 - ID == person_ID == household_ID(假定 ID 存在于 fiddle 中,并且 person_ID 和 household_ID 都不是).

SELECT id,id_sub,SEX
FROM household hh
WHERE SEX <> 'B'
    OR
      NOT EXISTS (SELECT 1 FROM household h where h.id=hh.id and ( h.SEX='F' or h.SEX='M') )
ORDER BY id

查询只获取所有记录,对于那些具有 SEX 'B' 的记录,它会检查 table 中是否没有具有 SEX 'F' 或 [=22= 的记录] 具有相同的 ID。 应该注意的是,具有值 'U' 的记录(OP 中未提及)是毫不费力地复制的。

如果您希望从 table 中删除 SEX 'B' 中存在另一个 SEX (F/M) 的记录 - 这将非常相似:

DELETE FROM household hh
WHERE SEX = 'B'
 AND
  EXISTS (SELECT 1 FROM household h where h.id=hh.id and ( h.SEX='F' or h.SEX='M') )

随着条件的明显反转