2

我在使用 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 列,但是由于我要处理数百万条记录,重新查询会使应用程序非常无效。

4

1 回答 1

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

两种情况下的输出:

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

这是两个查询的SQLFiddle演示。

于 2013-06-14T10:02:06.073 回答