如何创建一个oracle游标的子集
问题描述:
我有一个oracle表,其中有这两列,CreateDate和FlagId等等。 FlagID是一个整数列。我必须首先在(3000,3001,3002)中提取FlagID中的所有行。我将通过CreateDate,FlagID desc来执行select(3000,3001,3002)中的FlagID。现在,我将拥有这三列中的许多组。我必须选择最新的一组值。但是,它可能不总是三个。它可以是(3001,3002),(3000,3001,3002)等等。在这种情况下,我必须选择省略后续设置的前两行。如果顶行有三个标志,那么我必须检索三行。我已经创建了一个Oracle游标,并通过CreateDate按照这些值顺序选择了所有行。但我不确定如何通过从光标创建子集来选择最上面的一组行。如何创建一个oracle游标的子集
答
这将返回所有行新的比对FlagId 3000
甲骨文倒数第二日:
SELECT CreateDate, FlagId
FROM tab
WHERE FlagId in (3000, 3001, 3002) and
CreateDate > (SELECT MIN (CreateDate)
FROM (SELECT CreateDate
FROM ( SELECT CreateDate
FROM tab
WHERE FlagId = 3000
ORDER BY CreateDate DESC)
WHERE ROWNUM < 3));
MySQL的:
select CreateDate, FlagId from t1
where FlagId in (3000, 3001, 3002) and
CreateDate >
(select min(CreateDate) from (
select CreateDate from t1
where FlagId = 3000
order by CreateDate desc
limit 2) sub);
答
在这里,我用分层查询做到这一点。第一部分按顺序枚举数据:createdate desc, flagid
。 第二部分按此顺序排列前三行。本质在连接条款:prior fid < fid and rn = prior rn + 1
。
with enum as (
select createdate cd, flagid fid, row_number()
over (order by createdate desc, flagid) rn
from t where flagid in (3000, 3001, 3002))
select cd, fid from enum where rn <= 3
connect by prior fid < fid and rn = prior rn + 1
start with rn = 1
样品的输入和输出:
CREATEDATE FLAGID CD FID
------------------- ------ ------------------- ----
2015-03-24 11:48:29 3000 2015-03-25 12:24:52 3000
2015-03-24 11:48:29 3001 2015-03-25 11:49:13 3001
2015-03-24 11:48:29 3002 2015-03-25 11:49:13 3002
2015-03-25 11:48:45 3000
2015-03-25 11:48:45 3001
2015-03-25 11:49:13 3001
2015-03-25 11:49:13 3002
2015-03-25 12:24:52 3000
如果每个组都会有一个日期,那么您的解决方案将是非常非常优雅。不过他们会有不同的日期。 – user466663 2015-03-25 03:49:35
所以你需要三个值中的每一个的最新值?如果他们不分享同一日期,他们怎么能成为一个集合? – 2015-03-25 03:56:11
它稍微复杂一点。首先,我必须获得最新的3000,然后在遇到另一个3000之前获取3001或3002,按日期排序。 – user466663 2015-03-25 04:10:56