查询删除重复项
Posted
技术标签:
【中文标题】查询删除重复项【英文标题】:Query to remove duplicate 【发布时间】:2021-09-26 20:03:03 【问题描述】:我需要像下面的例子一样选择不同的行
源表值
Column 1 | Column 2
A A10
A A11
A A12
B B12
c C11
D D10
D D78
选择查询后的预期输出:
Column 1 | Column 2
A A10
B B12
C C11
D D10
因此,如果第 1 列中有重复项,我需要通过选择 col2 中以 10 结尾的记录来获取不同的行.....如果 col1 是唯一的,请继续使用 col2 值.....它不需要以 10 结尾
更新:不能应用 distinct on,因为还有其他列以及每行的不同值,并且不能使用临时表,因为我需要将它容纳在单选查询的 where 子句中
【问题讨论】:
使用distinct on 【参考方案1】:您可以使用联合查询不同的行。 union 的上半部分查询所有以 10 结尾的行。 联合查询的下半部分在第一列中具有唯一值的行。 union的上下部分相同的行将由union自己处理。
Select Col1, Col2
From (
Select Col1, Col2
From Tbl
Where Col2 Like '%10'
Union
Select Col1, Max(Col2)
From Tbl
Group by Col1
Having Count(*)=1) As T
Order by Col1
单选查询
Select T.Col1, Max(T.Col2)
From Tbl As T Left Join Tbl As T1 On (T.Col1=T1.Col1 And T.Col2<>T1.Col2)
Where T1.ID Is Null Or
(T1.ID Is Not Null And T.Col2 Like '%10')
Group by T.Col1
Order by T.Col1
【讨论】:
非常感谢您提供的解决方案【参考方案2】:temp1 - 查找以 10
作为右 2 个字符的 col2
temp2 - 为每个 col1 组创建行号,按 has_10
desc 排序
最终选择 - 获取所有 rownum = 1
with temp1 as (
select col1,
col2,
case when RIGHT(col2, 2) = 10 then 1
else 0
end as has_10
from source_table
),
temp2 as (
select col1,
col2,
row_number() over(
partition by col1
order by has_10 desc
) as rownum
from temp1
)
select col1,
col2
from temp2
where rownum = 1;
【讨论】:
【参考方案3】:使用 PostgreSQL,您可以简单地使用 DISTINCT ON
:
SELECT DISTINCT ON (col1) col1, col2
FROM tab
ORDER BY col2;
【讨论】:
还有其他列取决于这两个值.....所以不能应用 distinct on...抱歉没有提及它会更新它以上是关于查询删除重复项的主要内容,如果未能解决你的问题,请参考以下文章