如何创建oracle游标的子集

时间:2015-03-25 03:09:35

标签: sql oracle

我有一个oracle表,其中包含CreateDate和FlagId这两个列。 FlagID是整数列。我必须先在(3000,3001,3002)中使用FlagID提取所有行。我将执行select语句,其中FlagID在(3000,3001,3002)中由CreateDate,FlagID desc排序。现在我将拥有这三行中的许多组。我必须选择最新的一组价值。但是,它可能并不总是三个一组。它可以是(3001,3002),(3000,3001,3002)等。在这种情况下,我必须选择前两行,省略后续集合。如果顶行有三个标志,那么我必须检索三行。我创建了一个oracle游标,并通过CreateDate获取这些值选择的所有行。但我不确定如何通过从光标创建子集来选择顶部行集。

2 个答案:

答案 0 :(得分:0)

这将返回比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);

答案 1 :(得分:0)

这里我使用分层查询来执行此操作。第一部分按顺序枚举数据:createdate desc, flagid。 第二部分按顺序排在前三行。 Essence在connect by子句中: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