根据 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
所以我们可以忽略它们)
目标:我需要处理以下情况:
如果 household_ID
与 SEX_CODE
='M' 和 'F' return 这两行重复。
如果 household_ID
与 SEX_CODE
='B' 和 'F'/'M' 重复
然后 return 仅 'F'/'M'(或删除 'B')。
- 如果
household_ID
与 SEX_CODE
='B' 和 'F' 以及 'M' 重复
然后 return 只有 'F' 和 'M'(或删除 'B')。
有几个问题我 运行
我的主要查询是按 household_ID
和 sub_ID
分组,所以如果这些行具有相同的 household_ID
,我就无法吐出 2 行和 sub_ID
.
我不知道如何拆分成 3 个案例。我可以使用 CASE
和 COUNT
.
分为两种情况
我觉得我需要以一种完全不同的方式来处理它,而不是按组,但我不知道如何按案例进行分组。
我可以在 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') )
随着条件的明显反转
数据集上下文:Table有一列SEX_CODE
可以是M、F、B(已婚,所以名字是两个名字的组合)。所以一个 household_ID
可以有三个重复项,都具有不同的 SEX_CODE
,并且被归类在 3 个单独的 sub_id
中。 (还有 'U'-unknown,但那些从来没有重复的 household_ID
所以我们可以忽略它们)
目标:我需要处理以下情况:
如果
household_ID
与SEX_CODE
='M' 和 'F' return 这两行重复。如果
household_ID
与SEX_CODE
='B' 和 'F'/'M' 重复 然后 return 仅 'F'/'M'(或删除 'B')。- 如果
household_ID
与SEX_CODE
='B' 和 'F' 以及 'M' 重复 然后 return 只有 'F' 和 'M'(或删除 'B')。
有几个问题我 运行
我的主要查询是按
household_ID
和sub_ID
分组,所以如果这些行具有相同的household_ID
,我就无法吐出 2 行和sub_ID
.我不知道如何拆分成 3 个案例。我可以使用
CASE
和COUNT
. 分为两种情况
我觉得我需要以一种完全不同的方式来处理它,而不是按组,但我不知道如何按案例进行分组。
我可以在 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') )
随着条件的明显反转