与 group by 相比,在 sql 中使用过度分区

问题描述

鉴于下面的表创建代码,是否有其他方法可以显示相同的结果

select b.*,count(*) over (partition by colour) bricks_total 
from bricks b;

使用 group bycount(*)在这种情况下有什么区别?

create table bricks 
(
     brick_id integer,colour   varchar2(10),shape    varchar2(10),weight   integer
);

insert into bricks values (1,'blue','cube',1);
insert into bricks values (2,'pyramid',2);
insert into bricks values (3,'red',1);
insert into bricks values (4,2);
insert into bricks values (5,3);
insert into bricks values (6,'green',1);

commit;

解决方法

此查询将每种颜色的总数放在每一行中:

select b.*,count(*) over (partition by colour) as bricks_total
from bricks b;

在窗口函数之前,一个典型的解决方案是关联子查询:

select b.*,(select count(*) from bricks b2 where b2.colour = b.colour) as bricks_total
from bricks b;

您也可以使用 join 和聚合来表达:

select b.*,bb.bricks_total
from bricks b join
     (select bb.colour,count(*) as bricks_total
      from bricks bb
      group by bb.colour
     ) bb
     using (colour);

这些并非 100% 相同。不同之处在于,即使值为 colour,原始代码也会返回 NULL 的计数。此代码返回 0

所以,更精确的等价物是:

select b.*,(select count(*)
        from bricks b2
        where b2.colour = b.colour or
              b2.colour is null and b.colour is null
       ) as bricks_total
from bricks b;

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...