【问题标题】:How to select last occurrence of duplicating record in oracle如何在oracle中选择最后一次出现的重复记录
【发布时间】:2013-06-10 22:39:07
【问题描述】:

我在使用 Oracle 查询时遇到问题,其基本目标是获取每个重复出现的行的最后一行,但是您可以从数据中理解一个复杂的问题:

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

ID    | COL1 | COL2 | COL3 | UPDATED_DATE
------|------|------|------|-------------
001   | a    | b    | c    | 14/05/2013
002   | a    | b    | c    | 16/05/2013
003   | a    | b    | c    | 12/05/2013

您应该能够猜到,由于第 1 到第 3 列对于所有 3 行具有相同的值,因此它们是重复出现的数据。问题是,我想获取最新更新的行,即第 2 行。

如果表没有 ID 列,我有一个现有的查询,但我仍然需要该列,所以如果有人能帮助我指出我做错了什么,那就太好了。

select col1,
       col2,
       col3,
       max(updated_date)
  from tbl
 order by col1, col2, col3;

上面的查询返回我第 2 行,这是正确的,但我仍然需要 ID。

注意:我知道我可以用另一个基于 4 列选择 ID 列的查询来封装上述查询,但由于我要处理数百万条记录,重新查询会使应用程序非常无效.

【问题讨论】:

    标签: database oracle


    【解决方案1】:

    试试

    WITH qry AS 
    (
      SELECT ID, COL1, COL2, COL3, updated_date, 
             ROW_NUMBER() OVER (PARTITION BY COL1, COL2, COL3 ORDER BY updated_date DESC) rank
      FROM tbl
    )
    SELECT ID, COL1, COL2, COL3, updated_date
      FROM qry
     WHERE rank = 1
    

    SELECT t1.ID, t2.COL1, t2.COL2, t2.COL3, t2.updated_date
      FROM tbl t1 JOIN
    (
      SELECT COL1, COL2, COL3, MAX(updated_date) updated_date
        FROM tbl
       GROUP BY COL1, COL2, COL3
    ) t2 ON t1.COL1 = t2.COL1
        AND t1.COL2 = t2.COL2
        AND t1.COL3 = t2.COL3
        AND t1.updated_date = t2.updated_date
    

    两种情况下的输出:

    |身份证 | COL1 | COL2 | COL3 | UPDATED_DATE | -------------------------------------------------- ------ | 2 |一个 |乙 | c | 2013 年 5 月 16 日 00:00:00+0000 |

    这是两个查询的 SQLFiddle 演示。

    【讨论】:

    • 谢谢!它完美无缺!我想我需要学习分析查询。
    • @JonathanHandoyo 很高兴能帮上忙 :)
    猜你喜欢
    • 2014-07-17
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2017-02-09
    相关资源
    最近更新 更多