【发布时间】:2010-05-20 19:29:00
【问题描述】:
我有以下 Oracle 查询:
SELECT id,
DECODE(state, 'Open', state_in, NULL) AS open_in,
DECODE(state, 'Not Open', state_in, NULL) AS open_out,
FROM (
SELECT id,
CASE WHEN state = 'Open'
THEN 'Open'
ELSE 'Not Open'
END AS state,
TRUNC(state_time) AS state_in
FROM ...
)
这给了我如下数据:
id open_in open_out
1 2009-03-02 00:00:00
1 2009-03-05 00:00:00
1 2009-03-11 00:00:00
1 2009-03-26 00:00:00
1 2009-03-24 00:00:00
1 2009-04-13 00:00:00
我想要的是这样的数据:
id open_in open_out
1 2009-03-02 00:00:00 2009-03-05 00:00:00
1 2009-03-11 00:00:00 2009-03-24 00:00:00
也就是说,保留所有唯一的id/open_in 对,并与open_in 之后最早的open_out 配对。对于给定的id,可以有任意数量的唯一open_in 值,以及任意数量的唯一open_out 值。唯一的 id/open_in 可能没有匹配的 open_out 值,在这种情况下,open_out 应该是该行的 null。
我觉得一些分析函数,可能是LAG 或LEAD,在这里会很有用。也许我需要MIN 与PARTITION 一起使用。
【问题讨论】:
-
我使用有限的接口(没有直接的数据库访问),所以我不确定确切的版本,但根据我已经能够使用的功能,我猜可能有 10 个。我无权访问
EXPLAIN PLAN,只能访问SELECT。 -
您的预期输出中可能存在拼写错误 - 不应该是
2009-03-26而不是 24 号吗? -
如果你发出“select * from v$version”并且你有权限这样做,你可以看到确切的版本。
-
@OMG Ponies:不,3/24 是正确的,因为它是 3/11 之后的最早日期。 3/26 在 3/11 之后首先列出,是的,但随后是 3/24 和 4/13。 @Rob:所以请帮助我,我以前尝试过,但它从来没有奏效,但它现在就奏效了。也许我们的数据库管理员很慷慨!我有 10 克。
标签: oracle select plsql aggregate analytic-functions