【问题标题】:Group by vs Partition by in OracleOracle中的分组依据与分区依据
【发布时间】:2011-10-14 10:30:59
【问题描述】:

我正在编写一个查询以从 Oracle 仓库中获取记录。它是一个简单的选择查询,在几个表上连接,我有几个列要聚合。因此,我最终在其余列上使用 Groupby。

假设我选择了大约 10 列,其中 5 列是聚合列。所以我需要按其他 5 列分组。我什至可以通过不执行 Groupby 并在我想要派生的每个聚合列上使用 over (partition by) 子句来实现相同的目标。

我不确定哪个更适合仓库或一般情况。

【问题讨论】:

    标签: sql oracle data-warehouse analytic-functions


    【解决方案1】:

    它们不一样。

    这将返回 3 行:

    select deptno, count(*) c from emp group by deptno;
    
    DEPTNO C
    ------ -
    10     3
    20     5
    30     6
    

    这将返回 14:

    select deptno, count(*) over (partition by deptno) c from emp;
    
    
    DEPTNO C
    ------ -
    10     3
    10     3
    10     3
    20     5
    20     5
    20     5
    20     5
    20     5
    30     6
    30     6
    30     6
    30     6
    30     6
    30     6
    

    【讨论】:

    • 我正在努力理解。如果我错了,请纠正我。因此,如果我与第二个查询不同,它将给我第一个查询结果。我只使用分区来根据分区列对某些子句执行 rank() 并获得第一名左右。第二个查询结果在什么情况下会有用?谢谢
    • 我想说,如果可以使用 GROUP BY 来完成,那就更可取了。分析函数应该用于您想要单个行加上一些聚合信息的情况 - 例如 rank() 示例。
    【解决方案2】:

    Check this link 聚合函数和分析函数之间的主要区别在于,尽管分析函数给出聚合结果,但它们不会对结果集进行分组。他们在每条记录中多次返回组值。

    【讨论】:

      【解决方案3】:

      使用PARTITON BY,可以在一个查询中执行此操作以获得不同的计算或分组依据。

      select
           DISTINCT deptno, count(*) over (partition by deptno) c,
           COUNT(*) OVER (PARTITION BY NULL) AS TOTAL
      from emp;
      

      【讨论】:

        猜你喜欢
        • 2021-10-23
        • 2017-09-21
        • 2011-09-24
        • 2010-10-08
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多