分析函数_CUME_DIST -- SQL Server 2012 & Hive

最近在整理 Hie 分析函数资料的时候,看到了 CUME_DIST,百度后还是不知其意。于是乎用起了之前介绍的 Webcrawler 搜索引擎 :http://www.webcrawler.com/

发现 SQL Server中也包含该分析函数。接下来让我们看看如何在 SQL Server 2012 中使用该分析函数,以帮助大家深入理解 CUME_DIST 函数在 Hive 中的使用。

根据 SQL Server 给出的解释,它提供该函数主要用来计算分布值,当然肯定跟具体的业务逻辑相挂钩的。这里也不是一两句话能解释清楚的,大家可以将该函数跟我们学习概率统计的时候“小球取出不放回”的场景结合理解会更好。
接下来,让我们看看该函数的具体应用:

CUME_DIST() 函数的计算方式为:小于等于当前值的行数 / 当前分组总行数 

USE AdventureWorks
GO
SELECT SalesOrderID, OrderQty,
CUME_DIST() OVER(ORDER BY SalesOrderID) AS CDist
FROM Sales.SalesOrderDetail
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY CDist DESC
GO

查询结果如下:

分析函数_CUME_DIST -- SQL Server 2012 & Hive_第1张图片

接下来让我们看看后面公式的意义以及为什么 SalesOrderID = 43670 返回的结果为 1.

分析函数_CUME_DIST -- SQL Server 2012 & Hive_第2张图片

同理,根据以上的算法,我们可以得出 SalesOrderID = 43667 所对应的 CUME_DIST() 返回值为 (4+1)/10 = 0.5

接下来我们在看看更为复杂的场景:将 Partition By 添加到 Over 子句中。在 SQL Server 2012 中运行下面代码,查看结果:

USE AdventureWorks
GO
SELECT SalesOrderID
           , OrderQty
           , ProductID
           CUME_DIST() OVER(PARTITION BY SalesOrderID ORDER BY ProductID ) AS CDist
FROM Sales.SalesOrderDetail s
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY s.SalesOrderID DESC, CDist DESC
GO

让我看看根据SalesOrderID分区 & ProductID 排序后的查询结果:

分析函数_CUME_DIST -- SQL Server 2012 & Hive_第3张图片

你可以发现CUME_DIST()函数返回不同的结果。大家可以发现,在加入 Partition 后,CUME_DIST()计算操作是针对每个分区进行的。而不是对整张查询表。
大家或许会有疑问:为什么在 SalesOrderID=43670情况下,ProductID=776 为1 ,而不是 ProductID=709 = 1.

这是因为分析函数是在 Group By  操作后才执行的, 计算的最终结果再进行 Order By操作。 -- 有时间我会介绍一些 SQL中语句的逻辑执行顺序(只为提醒自己)

分析函数_CUME_DIST -- SQL Server 2012 & Hive_第4张图片

需要注意的是,这里所谓的行数代表的就是当前字段所在的 Row 位置,如下面的高亮部分显示。这里所谓的当前值是针对 Order By 的字段进行计算。在加上 Partition 的时候,只是对分组中的 order by 字段进行计算罢了。如果该值含有多行,则对它们进行归于一类进行计算。如下面 SalesOrderID=43670的情况。

分析函数_CUME_DIST -- SQL Server 2012 & Hive_第5张图片

你可能感兴趣的:(Hive,搜索引擎,SQL,Functions)