【问题标题】: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 子句中

【问题讨论】:

标签: postgresql


【解决方案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...抱歉没有提及它会更新它
    猜你喜欢
    • 1970-01-01
    • 2012-11-02
    • 2011-08-18
    • 2019-12-11
    • 2013-03-03
    • 2014-07-03
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多