group by&窗口函数

group by
分组是把类似的行组织在一起的一种方式。当查询中使用group by时,结果集中的每一行都是一个组,而且表示一行或多行中的某一列或多列具有相同值。
如果某个组只是一行的唯一实例,该行表示一行或多行的某个特定列或某些列具有相同值

在sql中null是合法的值,聚集函数会忽略null,select count(null) from dual----0  select count(3) from dual---1

select COALESCE(null,null,6) from dual---6 返回第一个非空值

union all&union union去重复

当使用聚集函数的时候,对应select列表中的项,如果没有把它当作聚集函数的参数使用,那么它必须是组的一部分
由用户定义的函数,窗口函数和非关联的的标量子查询返回的常量,标量值,都是这种规则的例外。
由于select字句是在group by子句之后进行计算的,所以select列表允许这些结构

select t.column,count(t.column),count(*),'hello' as a,(select count(*) as c from dual) from table t group by t.column

select列表中没有包含在group by子句中的项不会影响column值,也不会改变count()的值

对于可能会更改组或更改聚集函数值的select列表项,一定包含于group by子句中。select列表中的附加项不会更改任何组的count值,也不会更改组本身

group by c1,c2 组是独特的,c1和c2的值都不是独特的,但两者的组合是独特的。

窗口
与聚集函数一样,窗口函数也针对定义的行集执行聚集,但它不像聚集函数那样每组只返回一个值,窗口函数可以为每组返回多个值
count(*)over() over关键字表明:把count的调用看作窗口函数,而不是聚集函数。sql标准允许将所有聚集函数用作窗口函数,而用关键字over区分两种用法

在sql处理中,窗口函数都是最后一步执行,而且仅位于order by子句之前。

partition by
count(*)over(partition by column)
如果partition by子句中没有分区,就意味着处理整个结果集
在同一个select语句中,一个窗口函数的计算独立于按其他列分区的其他窗口函数的计算

窗口函数处理行的顺序很重要,会影响查询返回的结果,所以,窗口函数语法包含了可以放在over子句内的order by小子句,order by子句用于指定分区中行的排序方式

当在窗口函数的over子句中使用了order by子句时,就指定了两件事
1 分区中的行如何排序
2 在计算中包含哪些行

select t.name,t.dept_name,
count(*) over(partition by t.dept_name),
count(*) over(partition by t.sex), --156  228
count(*) over(order by t.sex)      --156  384 
from tb_employee_mst t where t.grade = 'G3'

框架子句
count(*) over(order by t.sex range between unbounded preceding and current row) --156  384
从当前行开始,包括它前面的所以行(前面的是在order by中定义的)
count(*) over(order by t.sex range between unbounded preceding and current row) --
当前行和前面一行做count(*)
count(*) over(order by t.sex rows between current row and unbounded following)
从当前行开始,包括他后面的所有行
count(*) over(order by t.sex rows between current row and 1 following)
当前行和后面一行做count(*)

range&rows
unbounded preceding  --- ...2 preceding-- 1 preceding-- current row -- 1 following-- 2 following...-- unbounded following

猜你喜欢

转载自kangkan.iteye.com/blog/1551417