首页 > 解决方案 > 根据 SQL 上的条件删除结果

问题描述

数据集上下文:表有一列SEX_CODE可以是M、F、B(已婚,所以名字是两个名字的组合)。所以 ahousehold_ID可以有三个重复项,都具有不同SEX_CODE的 ',并分为 3 个单独的sub_id。(还有'U'-unknown,但那些从来没有重复household_ID,所以我们可以把它们排除在外)

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

  1. 如果 ahousehold_IDSEX_CODE='M' 和 'F' 重复,则返回这两行。

  2. 如果 ahousehold_IDSEX_CODE='B' 和 'F'/'M' 重复,则仅返回 'F'/'M' (或删除 'B')。

  3. 如果 ahousehold_IDSEX_CODE='B' 和 'F' 和 'M' 重复,则仅返回 'F' 和 'M' (或删除 'B')。

我遇到了几个问题

  1. household_ID我的主要查询是按and分组,因此如果这些行具有相同的and sub_ID,我将无法吐出 2 行。household_IDsub_ID

  2. 我不知道如何分成3种情况。我可以使用CASEand分成两种情况COUNT

SQL小提琴

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

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

标签: sqlmultiple-conditions

解决方案


假设 - ID == person_ID == home_ID(假设 ID 存在于小提琴中,而 person_ID 和 home_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' 的记录,它会检查表中是否没有具有相同 ID 的 SEX 'F' 或 'M' 的记录。应该注意的是,带有值“U”的记录(在 OP 中未提及),无需多言即可复制。

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

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') )

随着条件的明显逆转。


推荐阅读