SQL:使用案例在单独的列中查找重复项和标记
Posted
技术标签:
【中文标题】SQL:使用案例在单独的列中查找重复项和标记【英文标题】:SQL : Finding duplicates and flag in separate column with Case 【发布时间】:2021-02-25 12:10:56 【问题描述】:我正在尝试在表中查找重复项并想添加一个新的标志列。 以下示例数据:
Column A Column B
1 888
1 999
1 777
2 444
2 444
3 555
4 222
期望的输出:
Column A Column B Flag_output
1 888 DUPLICATE
1 999 DUPLICATE
1 777 DUPLICATE
2 444 NULL
2 444 NULL
3 555 NULL
4 222 NULL
案例 1:当 A 列具有相同的值而 B 列中的值不同时(例如 A 列中的值 1) - 应标记为 DUPLICATE
案例 2:当 A 列在多行中与 B 列中的相同值具有相同的值时(例如 A 列中的值 2) - 应标记为空
案例 3:当 A 列和 B 列具有唯一值时(例如 A 列中的值 3 和 4) - 也应该是标记为NULL
任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:你可以使用窗口函数:
select t.*,
(case when min(b) over (partition by a) <> max(b) over (partition by a)
then 'DUPLICATE'
end) as flag_output
from t;
【讨论】:
真的很感激。它几乎可以工作但是我想问是否继续相同,是否可以添加这样的情况,如果 Column_A 和 Column_B 有一个分别为 1 和 777 的记录并且在所需的输出中,我们想要两行 1 和777 标记为 NULL?和值 1 888 和 1 999 的前两行将作为 DUPLICATE 提前谢谢。 @FarhanPanja 。 . .这回答了您在这里提出的问题。您的评论听起来像是一个不同的问题,应该作为新问题提出。 @Gordon Linoff 谢谢你的建议。我发布了一个新问题。你能在那里看看并帮忙吗?链接如下:(***.com/questions/66392429/…)谢谢【参考方案2】:你可以这样做:
UPDATE MISC.YOUR_TABLE SET FLAG_OUTPUT='DUPLICATE' WHERE COLUMN_A=
(SELECT COLUMN_A FROM (SELECT COLUMN_A, COUNT(*) A_COUNT FROM (SELECT DISTINCT COLUMN_A, COLUMN_B FROM MISC.YOUR_TABLE) Q GROUP BY COLUMN_A) R WHERE A_COUNT>1)
或者,如果您不更新实际列,您可以这样做:
SELECT YT.COLUMN_A, YT.COLUMN_B, DUPQ.FLAG_OUTPUT
FROM MISC.YOUR_TABLE YT
LEFT OUTER JOIN
(SELECT COLUMN_A, 'DUPLICATE' FLAG_OUTPUT FROM (SELECT COLUMN_A, COUNT(*) A_COUNT FROM (SELECT DISTINCT COLUMN_A, COLUMN_B FROM MISC.YOUR_TABLE) Q GROUP BY COLUMN_A) R WHERE A_COUNT>1) DUPQ
ON YT.COLUMN_A=DUPQ.COLUMN_A
【讨论】:
以上是关于SQL:使用案例在单独的列中查找重复项和标记的主要内容,如果未能解决你的问题,请参考以下文章
sql SQL查询以查找表中的列中的重复项,从而更改列的排序规则以确保重复项检查为大小写