为了账号安全,请及时绑定邮箱和手机立即绑定

函数计算SQLServer中的中位数

函数计算SQLServer中的中位数

智慧大石 2019-06-25 17:14:18
函数计算SQLServer中的中位数根据MSDN,中位数在Transact-SQL中不能作为聚合函数使用。但是,我想知道是否可以创建此功能(使用创建聚合函数、用户定义函数或其他方法)。最好的方法(如果可能的话)是什么?允许在聚合查询中计算中值(假设是数字数据类型)?
查看完整描述

3 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

有很多方法可以做到这一点,而且性能有很大的变化。这里有一个特别优化的解决方案,来自中介、行号和性能..当涉及到在执行过程中生成的实际I/O时,这是一个特别优化的解决方案-它看起来比其他解决方案花费更高,但它实际上要快得多。

该页面还包含其他解决方案和性能测试细节的讨论。注意,在中间列的值相同的多行情况下,使用唯一列作为消歧器。

与所有数据库性能场景一样,始终尝试使用真实硬件上的真实数据测试解决方案-您永远不知道对SQLServer优化器的更改或您环境中的特性何时会使一个通常快速的解决方案变得更慢。

SELECT
   CustomerId,
   AVG(TotalDue)FROM(
   SELECT
      CustomerId,
      TotalDue,
      -- SalesOrderId in the ORDER BY is a disambiguator to break ties
      ROW_NUMBER() OVER (
         PARTITION BY CustomerId         ORDER BY TotalDue ASC, SalesOrderId ASC) AS RowAsc,
      ROW_NUMBER() OVER (
         PARTITION BY CustomerId         ORDER BY TotalDue DESC, SalesOrderId DESC) AS RowDesc   FROM Sales.SalesOrderHeader SOH) xWHERE
   RowAsc IN (RowDesc, RowDesc - 1, RowDesc + 1)GROUP BY CustomerIdORDER BY CustomerId;


查看完整回答
反对 回复 2019-06-25
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

如果您使用的是SQL 2005或更高版本,那么对于表中的单个列来说,这是一个很好的、简单的中值计算:

SELECT(
 (SELECT MAX(Score) FROM
   (SELECT TOP 50 PERCENT Score FROM Posts ORDER BY Score) AS BottomHalf)
 +
 (SELECT MIN(Score) FROM
   (SELECT TOP 50 PERCENT Score FROM Posts ORDER BY Score DESC) AS TopHalf)) / 2 AS Median


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 2129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信