SQL sever 基础学习8 (高级处理)

一.窗口函数

<窗口函数> over ([partition by <列清单>]
            order by <排序用清单>)

注:窗口函数大体可以分为两种

1. 能够作为窗口函数的聚合函数(sum, avg, count, max, min )

2.rank, dense_rank, row_number 等专用窗口函数

1.rank函数

--升序例
select product_name, product_type, sale_price, 
        rank () over (partition by product_type
                            order by sale_price asc) as ranking
    from product;
--降序例
select product_name, product_type, sale_price, 
        rank () over (partition by product_type
                            order by sale_price desc) as ranking
    from product;

注:partition by能够设定排序的对象范围, order by能够按照那一列,何种顺序进行排序

注2:通过partition by分组后的记录集合称为窗口,也是表示范围

由于partition by可以省略,当省略后再排序发现结果不在分组,或者可以说整个结果就是一组按照升序或降序排序的结果。

2.专用窗口函数的种类

函数描述
rank计算排序时,如果遇到相同位次的记录,会跳过之后的位次,如有三条记录并列,则排序表示为1,2,2,2,5
dense_rank计算排序时,如果遇到相同位次的记录,也不会跳过之后的为此,如1,2,2,2,3
row_number赋予唯一的连续位次,如1,2,3,4,5

注:窗口函数不能在where 或者group by子句中使用,且窗口函数只能在select子句中使用

3.作为窗口函数使用的聚合函数

注:聚合开窗函数只能使用PARTITION BY子句或都不带任何语句,ORDER BY不能与聚合开窗函数一同使用。

<窗口函数> over ([partition by <列清单>])
--例
select product_id, product_name, sale_price, 
        sum (sale_price) over (partition by product_type) as current_sum
    from product;

二. GROUPING 运算符

1.rollup——同时得到合计与小计

--例1
select '合计' as product_type, sum(sale_price) 
    from product
union all
select product_type, sum(sale_price)
    from product
group by product_type;
--例2
select product_type, sum(sale_price) as sum_price
    from product
group by rollup(product_type);
--例3:在合计的行中插入'合计' 的字符串
select case when grouping(product_type) =1
            then '商品种类 合计'
            else product_type end as product_type,
        case when grouping(regist_date) =1
            then '登记日期 合计'
            else cast(regist_date as char(20)) end as regist_date,
        sum(sale_price) as sum_price
    from product
    group by rollup(product_type, regist_date);

以此计算出不同聚合键组合的汇总结果

又如:

select peoduct_type, regist_date, SUM(sale_price) as sum_price
    from product
    group by rollup(peoduct_type, regist_date);

结果中会出现各个分组的总计,分组内的小计和分组三个模块。

2.使用grouping函数分辨null值

grouping函数在其参数列的值为null时返回1,其他值返回0;

select grouping(product_type) as product_type,
            grouping(regist_date) as regist_date, sum(sale_price) as sum_price
    from product
    group by rollup(product_type, regist_date);

3.cube

select case when grouping(product_type) =1
            then '商品种类 合计'
            else product_type end as product_type,
        case when grouping(regist_date) =1
            then '登记日期 小计'
            else cast(regist_date as char(20)) end as regist_date,
        sum(sale_price) as sum_price
    from product
    group by cube(product_type, regist_date);

cube就是将group by子句中的聚合键的所有可能组合汇总到一个结果中,即商品种类合计再与各个登记日期小计进行组合追加结果

4.grouping sets :从rollup与cube的结果中取出部分记录。

也即去除聚合键各自的结果而去除使用两个聚合见得到的结果

select case when grouping(product_type) =1
            then '商品种类 合计'
            else product_type end as product_type,
        case when grouping(regist_date) =1
            then '登记日期 小计'
            else cast(regist_date as char(20)) end as regist_date,
        sum(sale_price) as sum_price
    from product
    group by  grouping sets(product_type, regist_date);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值