【问题标题】:How to create a subset of a oracle cursor如何创建 oracle 游标的子集
【发布时间】:2015-03-25 03:09:34
【问题描述】:

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

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

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

    【讨论】:

    • 如果每个集合都有一个日期,那么您的解决方案将非常优雅。但是他们会有不同的日期。
    • 那么您需要三个值中的每一个的最新值吗?如果他们不共享相同的日期,他们怎么能成为一个集合?
    • 有点复杂。首先我必须得到最新的 3000,然后在遇到另一个 3000 之前任何 3001 0r 3002,按日期排序。
    • 我又试了一次。希望对您有所帮助。
    • 我在 desc 和 limit 2 之间缺少右括号错误
    【解决方案2】:

    这里我使用分层查询来做到这一点。第一部分按顺序列举数据:createdate desc, flagid。 第二部分按该顺序取前三行。本质在connect by子句中:prior fid &lt; 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      相关资源
      最近更新 更多