代码之家  ›  专栏  ›  技术社区  ›  ScottCher

Oracle Analytics-SQL查询的分区和排序

  •  3
  • ScottCher  · 技术社区  · 16 年前

    当回答其他用户的 question (软件编辑)

    给出下表:

    ROW_PRIORITY   COL1     COL2    COL3
    0              0.1      100     <NULL>
    12             <NULL>   <NULL>  3
    24             0.2      <NULL>  <NULL>
    

    以及以下查询:

    select  'B' METRIC, ROW_PRIORITY,
            last_value(col1 ignore nulls) over (ORDER BY ROW_PRIORITY) col1,
            last_value(col2 ignore nulls) over (ORDER BY ROW_PRIORITY) col2,
            last_value(col3 ignore nulls) over (ORDER BY ROW_PRIORITY) col3
    from    (SELECT * FROM ZTEST);
    

    我得到这些结果:

    METRIC  ROW_PRIORITY    COL1    COL2    COL3
    B            0          0.1     100     <NULL>
    B           12          0.1     100     3
    B           24          0.2     100     3
    

    预期:

    METRIC  ROW_PRIORITY    COL1    COL2    COL3
    B            0          0.2     100     3
    B           12          0.2     100     3
    B           24          0.2     100     3
    

    当然,问题是,为什么在col1等中,每行优先级不为0.2?最后一个值应该先执行order by,然后从分区中选择最后一个值。在上面的查询中,分区是整个记录集,所以我可以看到上面预期的结果。

    有人能解释吗?

    1 回复  |  直到 16 年前
        1
  •  5
  •   TheSoftwareJedi jac    16 年前

    在分区子句中包含ORDERBY时,可以包含显式的窗口化子句。

    如果希望最后这些值覆盖所有行,则应在您的订单之后包括:

    前无边界行与后无边界行之间的行

    这样可以修复您的查询。

    文档中的详细信息:

    如果不指定行或range子句,则窗口大小的确定方式如下:

    • 如果指定了ORDER BY子句,则窗口从分区中的第一行(前面未绑定)开始,以当前行(当前行)结束。
    • 如果未指定ORDER BY子句,则窗口以分区中的第一行(前面未绑定)开始,以分区中的最后一行(后面未绑定)结束。
    推荐文章