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