分析函数 头疼

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, 'blue', 'pyramid', 2 );

insert into bricks values ( 3, 'red', 'cube', 1 );

insert into bricks values ( 4, 'red', 'cube', 2 );

insert into bricks values ( 5, 'red', 'pyramid', 3 );

insert into bricks values ( 6, 'green', 'pyramid', 1 );

commit;

计算表中的总行数。它返回一行

select count(*) from bricks;

添加 over 子句将其转换为解析。这将保留输入行。

select count(*) over () from bricks;

您查看所有其他列的值,您不能使用 group by

select b.*,

       count(*) over () total_count

from   bricks b;

分组依据 

group by 子句将行拆分为具有相同值的组。例如,以下获取每种颜色的行数和总重量

select colour, count(*), sum ( weight )

from   bricks

group  by colour;

 

使用 partition by 子句将输入分割为这样

select b.*,

       count(*) over (

         partition by colour

       ) bricks_per_colour,

       sum ( weight ) over (

         partition by colour

       ) weight_per_colour

from   bricks b;

 

 

Order By

按brick_id 对行进行排序。然后显示brick_id小于或等于当前行的行的总行数和重量之和:

select b.*,

       count(*) over (

         order by brick_id

       ) running_total,

       sum ( weight ) over (

         order by brick_id

       ) running_weight

from   bricks b;

 

分组+ 排序

组合 partition by 和 order by 子句以获得组内的行总数。

按颜色拆分行。然后获取每种颜色的运行行数和行重量

select b.*,

       count(*) over (

         partition by colour

         order by brick_id

       ) running_total,

       sum ( weight ) over (

         partition by colour

         order by brick_id

       ) running_weight

from   bricks b;

 

有几行具有相同的重量。因此,当您按此排序时,所有具有相同重量的行都具有相同的运行计数和重量

select b.*,

       count(*) over (

         order by weight

       ) running_total,

       sum ( weight ) over (

         order by weight

       ) running_weight

from   bricks b

order  by weight;

select b.*,

       count(*) over (

         order by weight

         rows between unbounded preceding and current row

       ) running_total,

       sum ( weight ) over (

         order by weight

         rows between unbounded preceding and current row

       ) running_weight

from   bricks b

order  by weight;

过滤分析函数

select colour from bricks

group  by colour

having count(*) >= 2;

 

不能在 where 中使用它

select colour from bricks

where  count(*) over ( partition by colour ) >= 2;

您必须在子查询中使用分析。然后在外部查询中过滤它 

select * from (

  select b.*,

         count(*) over ( partition by colour ) colour_count

  from   bricks b

)

where  colour_count >= 2;

 

上一个和下一个值(不显示第一行和不显示最后一行)

select b.*,

       lag ( shape ) over ( order by brick_id ) prev_shape,

       lead ( shape ) over ( order by brick_id ) next_shape

from   bricks b;

 

使用 first_value 和 last_value 获取有序集合中的第一个或最后一个值

first_value 的结果保持不变。但是对于 last_value 它每行都会改变。这是因为默认窗口子句在当前行停止。

select b.*,

       first_value ( weight ) over (

         order by brick_id

       ) first_weight_by_id,

       last_value ( weight ) over (

         order by brick_id

       ) last_weight_by_id

from   bricks b;

select b.*,

       first_value ( weight ) over (

         order by brick_id

       ) first_weight_by_id,

       last_value ( weight ) over (

         order by brick_id

         range between current row and unbounded following

       ) last_weight_by_id

from   bricks b;

猜你喜欢

转载自blog.csdn.net/weixin_39568073/article/details/121352481