我有一个包含三个字段的表ID
:date
和action
。的三个可能值action
是X
和。我想要一个查询,对于表中的每个有一个操作的行,如果存在一个操作,它将返回与操作相同的最新行。Y
Z
ID
Z
ID
X
这是我想在 MySQL 中做的事情。我从sqlfiddle.com复制并粘贴了代码,所以我知道它有效。
create table a (id int,
date int,
action varchar(1));
insert into a values(1, 1, 'X');
insert into a values(1, 2, 'X');
insert into a values(1, 3, 'Z');
insert into a values(2, 1, 'X');
insert into a values(2, 2, 'Y');
insert into a values(2, 3, 'Y');
insert into a values(2, 4, 'Z');
insert into a values(3, 1, 'X');
insert into a values(3, 2, 'Y');
insert into a values(3, 3, 'X');
insert into a values(3, 4, 'Z');
insert into a values(4, 3, 'X');
SELECT a.id,
max(a.date) as Xdate,
b.date as Zdate,
a.action FROM a,
(SELECT * FROM a WHERE a.action = 'Z') b
WHERE
a.date < b.date AND
a.ID = b.ID AND
a.action = 'X'
GROUP BY a.id;
我不能GROUP BY
在 Oracle 中将此子句与其他字段一起使用,所以我做了一个嵌套子查询,分别找到每个 ID 的最大日期,但它非常慢(我预计会得到大约 10^5 行)而且我希望有更好的方法可以更快地做到这一点。(我目前无法发布我的实际 Oracle 查询,因为它不在 SQLfiddle 中运行;它一直抱怨行的定义不明确。)
可以使上述查询以某种方式在 Oracle 中工作吗?如果没有,是否有等效的方法可以在合理的时间内运行?