groupby窗⼝函数
group by
分组是把类似的⾏组织在⼀起的⼀种⽅式。当查询中使⽤group by时,结果集中的每⼀⾏都是⼀个组,⽽且表⽰⼀⾏或多⾏中的某⼀列或多列具有相同值。
如果某个组只是⼀⾏的唯⼀实例,该⾏表⽰⼀⾏或多⾏的某个特定列或某些列具有相同值
在sql中null是合法的值,聚集函数会忽略null,select count(null) from dual----0 select count(3) from dual---1
groupby是什么函数select COALESCE(null,null,6) from dual---6 返回第⼀个⾮空值
union all&union union去重复
当使⽤聚集函数的时候,对应select列表中的项,如果没有把它当作聚集函数的参数使⽤,那么它必须是组的⼀部分
由⽤户定义的函数,窗⼝函数和⾮关联的的标量⼦查询返回的常量,标量值,都是这种规则的例外。
由于select字句是在group by⼦句之后进⾏计算的,所以select列表允许这些结构
lumn,lumn),count(*),'hello' as a,(select count(*) as c from dual) from table t group lumn
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 ade = '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-- -- unbounded following

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。