查询删除重复项

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...抱歉没有提及它会更新它

以上是关于查询删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

从 LEFT JOIN 查询中删除重复项

从 SQLite 中的 SQL 查询结果中删除重复项

提高查询的性能以删除重复项

如何删除 MySQL 表中的重复项

删除没有主键的重复项

SQL合并两个具有不同列号的选择查询,同时删除重复项?