根据SQL的条件删除结果

时间:2018-07-19 15:57:33

标签: sql multiple-conditions

数据集上下文:表具有一列SEX_CODE,可以是M,F,B(已婚,因此名称是两个名称的组合)。因此,household_ID可以具有三个重复项,每个重复项都具有不同的SEX_CODE,并且可以分为3个单独的sub_id。 (也有'U'-未知,但是那些从来没有重复的household_ID,所以我们可以忽略它们)

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

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

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

  3. 如果household_ID的副本与SEX_CODE ='B'和'F'和'M' 然后仅返回“ F”和“ M”(或删除“ B”)。

我遇到了几个问题

  1. 我的主要查询是按household_IDsub_ID进行分组,因此如果这些行具有相同的household_ID和{{1 }}。

  2. 我不知道该如何分为3种情况。我可以使用sub_IDCASE分为两种情况。

SQL Fiddle

我觉得我需要采用一种完全不同于分组的方式,但是我不知道如何按案例分组。

我可以在Excel中手动删除它们(突出显示重复项>按颜色过滤>过滤性别代码'B'>全部删除'em),但是查询将超过60,000行,所以我想知道是否有可能在COUNT中。但是,如果不可能做到这一点,请不要担心,我将在Excel中完成。

1 个答案:

答案 0 :(得分:0)

假设-ID == person_ID == Household_ID(假设小提琴中存在ID,而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'的记录,它检查表中是否没有具有相同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') )

条件明显逆转。