【问题标题】:Select last duplicate row with different id Oracle 11g选择具有不同 ID Oracle 11g 的最后一个重复行
【发布时间】:2017-12-07 03:47:18
【问题描述】:

我有一个如下所示的表格:

问题是我需要在“NRODENUNCIA”列中获取最后一条具有重复项的记录。

【问题讨论】:

  • 表格实际上没有顺序,因此您需要定义“最后一个”的含义。你也没有说你想要“最后一个”重复记录还是你想要每个重复的“最后一个”记录。
  • 没错,我需要每个副本的最后一条记录。我的英语不是很好;)

标签: sql oracle11g


【解决方案1】:

您可以使用MAX(DENUNCIAID)GROUP BY... HAVING 来查找重复项并选择DENUNCIAID 最大的行:

SELECT MAX(DENUNCIAID), NRODENUNCIA, FECHAEMISION, ADUANA, MES, NOMBREESTADO
FROM YourTable
GROUP BY NRODENUNCIA, FECHAEMISION, ADUANA, MES, NOMBREESTADO
HAVING COUNT(1) > 1

这只会显示至少有一个重复的行。如果您也想查看不重复的行,只需删除 HAVING COUNT(1) > 1

【讨论】:

  • 给定样本数据这可行,但当整行不重复时它将不起作用
  • @ConradFrix 是的。
【解决方案2】:

您的问题有多种解决方案。一种是使用row_number。

请注意,我在 OVER 子句中按 DENUNCIID 排序。这将“最后一条记录”定义为具有最大 DENUNCIID 的记录。如果您想以不同方式定义它,则需要更改正在排序的字段。

with dupes as (

SELECT 
        ROW_NUMBER() OVER (Partition by NRODENUNCIA ORDER BY DENUNCIID DESC) RN,
        *
FROM 
     YourTable
)
SELECT * FROM dupes where rn = 1   

这只是每个欺骗的最后一条记录。

如果您只想包含具有欺骗性的记录,则将 where 子句更改为

WHERE  rn =1 
  and NRODENUNCIA  in (select NRODENUNCIA from dupes where rn > 1)

【讨论】:

    猜你喜欢
    • 2020-10-18
    • 2021-09-18
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    • 2016-09-25
    • 2017-04-17
    相关资源
    最近更新 更多