如何在oracle中选择最后一次出现的重复记录

时间:2013-06-14 09:54:16

标签: database oracle

我遇到了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列的查询来封装上述查询,但由于我正在处理数百万条记录,因此重新查询将使应用程序非常无效

1 个答案:

答案 0 :(得分:13)

尝试

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

两种情况下的输出:

| ID | COL1 | COL2 | COL3 |               UPDATED_DATE |
--------------------------------------------------------
|  2 |    a |    b |    c | May, 16 2013 00:00:00+0000 |

以下是两个查询的 SQLFiddle 演示。