四分位间距-下限,上限和中位数

ca8*_*msm 6 vb.net sql-server excel

我正在尝试根据可以是任意长度的数字数组来计算四分位数范围

1,  1,  5,  6,  7,  8,  2,  4,  7,  9,  9,  9,  9
Run Code Online (Sandbox Code Playgroud)

我需要从这个四分位数范围得出的值是:

  • 上四分位
  • 中位数
  • 下四分位数

如果我将上述数字数组转储到Microsoft Excel(列A:M)中,则可以使用以下公式:

  • =QUARTILE.INC(A1:M1,1)
  • =QUARTILE.INC(A1:M1,2)
  • =QUARTILE.INC(A1:M1,3)

得到我的答案:

  • 4
  • 7
  • 9

我现在需要在SQL Server或VB.NET中计算这3个值。我可以使用任何一种语言的任何格式或对象来获取数组值,但是找不到像QUARTILE.INCExcel所具有的函数那样存在的任何函数。

有谁知道如何在SQL Server或VB.NET中实现此目标?

Tan*_*ner 6

可能有更简单的方法,但要获得四分位数,您可以使用NTILE (Transact-SQL)

将有序分区中的行分布到指定数量的组中。这些组从一开始编号。对于每一行,NTILE 返回该行所属组的编号。

所以对于你的数据:

SELECT  1 Val
INTO    #temp
UNION ALL
SELECT  1
UNION ALL
SELECT  5
UNION ALL
SELECT  6
UNION ALL
SELECT  7
UNION ALL
SELECT  8
UNION ALL
SELECT  2
UNION ALL
SELECT  4
UNION ALL
SELECT  7
UNION ALL
SELECT  9
UNION ALL
SELECT  9
UNION ALL
SELECT  9
UNION ALL
SELECT  9

-- NTILE(4) specifies you require 4 partitions (quartiles)
SELECT  NTILE(4) OVER ( ORDER BY Val ) AS Quartile ,
        Val
INTO #tempQuartiles
FROM    #temp

SELECT * 
FROM #tempQuartiles

DROP TABLE #temp
DROP TABLE #tempQuartiles
Run Code Online (Sandbox Code Playgroud)

这将产生:

Quartile    Val
1           1
1           1
1           2
1           4
2           5
2           6
2           7
3           7
3           8
3           9
4           9
4           9
4           9
Run Code Online (Sandbox Code Playgroud)

从中你可以找出你所追求的。

所以修改SELECT你可以这样做:

SELECT Quartile, MAX(Val) MaxVal
FROM #tempQuartiles
WHERE Quartile <= 3
GROUP BY Quartile
Run Code Online (Sandbox Code Playgroud)

生产:

Quartile    MaxVal
1           4
2           7
3           9
Run Code Online (Sandbox Code Playgroud)