代码之家  ›  专栏  ›  技术社区  ›  FerranB Tom

两个分析查询之间的差异

  •  1
  • FerranB Tom  · 技术社区  · 15 年前

    以下两个查询之间的区别是什么?两者都返回不同的行:

    with ordered_table as 
    (
    select * from table order by column1
    )
    select first_value(column2 ignore nulls) over (partition by column3)
    from ordered_table;
    

    select first_value(column2 ignore nulls) over (partition by column3 order by column1)
    from table;
    

    注意:我将尝试提供一个测试用例,但我认为对于有明确概念的人来说,这是不必要的。

    3 回复  |  直到 15 年前
        1
  •  0
  •   Quassnoi    15 年前
    WITH ordered_table AS
            (
            SELECT  *
            FROM    table
            ORDER BY
                    column1
            )
    SELECT  FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3)
    FROM    ordered_table
    

    此查询将返回每个分区的第一个值 column2 没有特别的顺序(即 CBO 可以自由选择它认为最好的订单。

    SELECT  FIRST_VALUE(column2 IGNORE NULLS) OVER (PARTITION BY column3 ORDER BY column1)
    FROM    table;
    

    此查询将返回每个分区的第一个值 柱2 ,分区排序依据 column1 .

    自从 SQL 语言在集合上操作,而您的 ORDER BY 子句与返回的集合无关 CTE , Oracle 只是忽略了 按顺序 部分。

    国会预算办公室 可以选择具体化、散列或以任何其他方式破坏 热膨胀系数 在被外部查询使用之前, 按顺序 用于 热膨胀系数 对于外部查询将丢失。

        2
  •  0
  •   EvilTeach    15 年前

    在第一个查询中,按列1排序实际上不起任何作用。

    它按顺序创建了一个结果集,但我认为这不会包含在分区语句中。 排序属于实际的分区子句。

        3
  •  0
  •   Dave Costa    15 年前

    第一个版本按列1对整个行集排序,然后按列3对其进行分区并进行分析计算。注意,第一列的初始排序不一定是通过分区来保持的——我认为这可能是挂起您的原因。

    第二个版本按第3列对数据进行分区,然后按第1列对每个分区内的数据进行排序,然后确定分析输出。