zoukankan      html  css  js  c++  java
  • SQL Server(00):分析函数

    一,分析函数

    分析函数基于分组,计算分组内数据的聚合值,经常会和窗口函数OVER()一起使用,使用分析函数可以很方便地计算同比和环比,获得中位数,获得分组的最大值和最小值。分析函数和聚合函数不同,不需要GROUP BY子句,对SELECT子句的结果集,通过OVER()子句分组。

    使用以下脚本插入示例数据:

    ;with cte_data as 
    (
    select 'Document Control' as Department,'Arifin' as LastName,17.78 as Rate 
    union all 
    select 'Document Control','Norred',16.82 
    union all 
    select 'Document Control','Kharatishvili',16.82
    union all 
    select 'Document Control','Chai',10.25 
    union all 
    select 'Document Control','Berge',10.25 
    union all 
    select 'Information Services','Trenary',50.48
    union all 
    select 'Information Services','Conroy',39.66 
    union all 
    select 'Information Services','Ajenstat',38.46
    union all 
    select 'Information Services','Wilson',38.46
    union all 
    select 'Information Services','Sharma',32.45
    union all 
    select 'Information Services','Connelly',32.45
    union all 
    select 'Information Services','Berg',27.40
    union all 
    select 'Information Services','Meyyappan',27.40
    union all 
    select 'Information Services','Bacon',27.40
    union all 
    select 'Information Services','Bueno ',27.40
    )
    select Department,LastName,Rate into #data from cte_data
    go

    分析函数通常和OVER()函数搭配使用,SQL Server中共有4类分析函数。

    在OVER()函数中通常会对窗口内的数据进行排序,把有序数据从上向下看作是一个序列,对当前行而言,在序列上方的为后,在序列下方的为前。对当前组而言,第一行在组内的最上面,末尾行在组内的最下面。

    注意:distinct子句的执行顺序是在分析函数之后。

    1、CUME_DIST 和PERCENT_RANK

    • CUME_DIST 计算的逻辑是:小于等于当前值的行数/分组内总行数
    • PERCENT_RANK 计算的逻辑是:(分组内当前行的RANK值-1)/ (分组内总行数-1),排名值是RANK()函数排序的结果值。

    以下代码,用于计算累积分布和排名百分比:

    select Department,LastName ,Rate
        ,cume_dist() over(partition by Department order by Rate) as CumeDist
        ,percent_rank() over(partition by Department order by Rate) as PtcRank
        ,rank() over(partition by Department order by Rate asc) as rank_number
        ,count(0) over(partition by Department) as count_in_group
    from #data
    order by DepartMent
        ,Rate desc

    2、PERCENTILE_CONT和PERCENTILE_DISC

    PERCENTILE_CONT和PERCENTILE_DISC都是为了计算百分位的数值,比如计算在某个百分位时某个栏位的数值是多少。

    • PERCENTILE_CONT是连续型,CONT代表continuous,连续值,意味它考虑的是区间,所以值是绝对的中间值;
    • PERCENTILE_DISC是离散型,DISC代表discrete,离散值。所以它更多考虑向上或者向下取舍,而不会考虑区间。

    以下脚本用于获得分位数:

    select Department  ,LastName  ,Rate
        ,PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY Rate) OVER (PARTITION BY Department) AS MedianCont
        ,PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY Rate) OVER (PARTITION BY Department) AS MedianDisc
        ,row_number() over(partition by Department order by Rate) as rn
    from #data order by DepartMent ,Rate asc

    3、LAG和LEAD

    在一次查询中,对数据表进行排序,把已排序的数据从上向下看作是一个序列,对当前行而言,在序列上方的为后,在序列下方的为前。

    在同一分组内,对于当前行:

    • Lag()函数用于获取从当前行开始向后(或向上)计数的第N行。
    • Lead()函数用于获取从当前行开始向前(或向下)计数的第N行。
    LAG (scalar_expression [,offset] [,default])    OVER ( [ partition_by_clause ] order_by_clause )
    LEAD ( scalar_expression [ ,offset ] , [ default ] )  OVER ( [ partition_by_clause ] order_by_clause )

    参数注释:

    • sclar_expression:标量表达式
    • offset:默认值是1,必须是正整数,对于LAG()函数表示从当前行(current row)回退的行数,对于LEAD()表示从当前行向前进的行数。
    • default :当offset超出分区范围时要返回的值。 如果未指定默认值,则返回NULL。 default可以是列,子查询或其他表达式,但必须跟sclar_expression类型兼容。

    结果日期,这两个函数特别适合用于计算同比和环比。

    select DepartMent ,LastName,Rate
        ,lag(Rate,1,0) over(partition by Department order by LastName) as LastRate
        ,lead(Rate,1,0) over(partition by Department order by LastName) as NextRate
    from #data order by Department ,LastName

    按照DepartMent进行分组,对Document Control这一小组进行分析:

    • 第一行,对于LastRate字段,向后不存在数据行,返回参数Default的值,字段NextRate的值是第二行的Rate字段的值。
    • 第二行,LastRate是第一行的Rate字段的值,NextRate是第三行的Rate字段的值。对于中间行,依次类推。
    • 最后一行,LastRate是倒数第二行的Rate字段的值,对于NextRate字段,由于最后一行向前不存在数据行,返回参数Default的值。

    4、FIRST_VALUE和LAST_VALUE

    获取分组内排在最末尾的行和排在第一位的行:

    LAST_VALUE ( [scalar_expression ) OVER ( [ partition_by_clause ] order_by_clause rows_range_clause )
    FIRST_VALUE ( [scalar_expression ] ) OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
  • 相关阅读:
    CLRS 10.28
    [转]教你如何查看各种浏览器的Cookies[IE cookies信息]
    红黑树c实现
    ubuntu下eclipse中键盘失灵
    putty中文乱码解决
    [ 转]关于linux下wireshark启动时Lua报错
    c/c++运算符优先级
    CLRS 10.45
    ubuntu 12.04 安装NS2
    SQL IsDate()
  • 原文地址:https://www.cnblogs.com/springsnow/p/12426959.html
Copyright © 2011-2022 走看看