第85页 3.1 假设集合函数
sanqi (平行线,下一个空间再相遇)
读过 T-SQL性能调优秘笈
- 章节名:3.1 假设集合函数
- 页码:第85页
排序集合函数是聚合函数的一种,但它对集合有顺序要求。其分为假设集合函数(包括RANK,DENSE_RANK,PERCENT_RANK,CUME_DIST)和逆分布函数(PERCENTILE_DIC,PERCENTILE_CONT)。这些函数虽然看起来与相应的窗口函数名字一样,但内涵是不一样的。窗口函数是在窗口内进行排序,排序集合函数在分组(GROUP BY)进行排序。窗口函数表示的是对当前值在窗口的中的排序,而排序集合函数是说对输入的某个值,返回该值在各分组中的排序,即假设输入值插入到分组中,其排序如何。例如:
DECLARE @val AS NUMERIC(12, 2) = 1000.00; SELECT custid, RANK(@val) WITHIN GROUP(ORDER BY val) AS rnk FROM Sales.OrderValues GROUP BY custid;返回 custid rnk ----------- ----------- 1 7 2 5 3 6 4 10 5 7 6 8 7 6 8 3 9 9 10 7 ... 但以上为标准SQL写法,SQL Server 2012还未支持。只有替代写法如下:
DECLARE @val AS NUMERIC(12, 2) = 1000.00; SELECT custid, COUNT(CASE WHEN val < @val THEN 1 END) + 1 AS rnk FROM Sales.OrderValues GROUP BY custid;
sanqi对本书的所有笔记 · · · · · ·
-
第52页 2.1.3 对进一步筛选的一些想法
技巧方法:可在聚合函数内用case when 语句实现在窗口内对具体字段的筛选,如下 SELECT empid...
-
第65页 2.2.2 ROW_NUMBER
用ROW_NUMBER实现随机排号,用以下语句报错 SELECT orderid, orderdate, val, ROW_NUMBER() O...
-
第85页 3.1 假设集合函数
-
第91页 3.1.5 通用的解决方法
因SQL Server 2012没有排序集合函数,但有相应的窗口函数,所以其通用替代方式如下: SELECT ...
-
第102页 3.4 字符串的连接
Oracle提供了排序集合函数实现字符串的拼接: SELECT custid, LISTAGG(orderid, ',') WITHIN ...
说明 · · · · · ·
表示其中内容是对原文的摘抄