在 SQL 中返回各种百分位数

Posted

技术标签:

【中文标题】在 SQL 中返回各种百分位数【英文标题】:Returning a variety of percentiles in SQL 【发布时间】:2015-02-20 14:04:41 【问题描述】:

我有一段代码返回一组数据的第 90 个百分位数,我正在尝试更改代码以返回其他百分位数(第 25、第 50、第 75)。这是成功返回第 90 个百分位数(没有插值)的代码:

SELECT Max ([Subquery]![RECP]) AS RECP90P
FROM (SELECT TOP 90 PERCENT [RECP] FROM [CompData Query] ORDER BY [RECP] DESC)  AS Subquery;

我的想法是,例如,如果我将代码更改为以下代码,我将能够返回第 25 个百分位数。这是我尝试过的:

SELECT Min ([Subquery]![RECP]) AS RECP25P
FROM (SELECT TOP 75 PERCENT [RECP] FROM [CompData Query] ORDER BY [RECP] DESC)  AS Subquery;

我知道 SQL 中没有 SELECT BOTTOM,所以我试图通过使用 MIN 来返回相反的结果。但是,当我尝试运行此代码时,我返回一个空白值。我尝试将DESC 更改为ASC 认为MIN 正在返回第一个 值而不是所有值的最小值,但即使这样也返回了一个空白值.有人能解释我哪里出错了吗?

这样的东西会起作用吗?

SELECT Max([CompData Query]![AgedSalary]) CASE ([CompData Query]![Code]) WHEN "RECP" AS RECP90P
FROM (SELECT TOP 90 PERCENT [AgedSalary] FROM [CompData Query] ORDER BY [RECP] DESC)  AS Subquery;

您能否解释一下为什么这个CASE WHEN 是错误的和/或缺少一个“操作员”:

SELECT CASE ([CompData Query]![Code]) WHEN "RECP" THEN SELECT Max([CompData Query]![AgedSalary]) AS RECP90P FROM (SELECT TOP 90 PERCENT [AgedSalary] FROM [CompData Query] ORDER BY [AgedSalary] DESC) ELSE 'Unknown' END;

谢谢。

【问题讨论】:

RECP 列中有空白值。这就是为什么您使用MIN() 获取它们的原因。 你知道如何排除表达式中的空白值吗? 我想我可能需要在 SQL 中使用 CASE WHEN 来排除空格 只需使用 where 子句即可消除您不想要的行。 `WHERE RTRIM([REC]) '' 你的 case 表达式是错误的。 【参考方案1】:

我认为 Access 有一个 TRIM() 函数,但 LTRIM、RTRIM 和 TRIM 中的任何一个都应该做你想做的事情。

SELECT Min ([Subquery]![RECP]) AS RECP25P
FROM (
    SELECT TOP 75 PERCENT [RECP]
    FROM [CompData Query]
    WHERE RTRIM([RECP]) <> ''
    ORDER BY [RECP] DESC
)  AS Subquery;

【讨论】:

以上是关于在 SQL 中返回各种百分位数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript(或 PHP)中获取数组的中位数和四分位数/百分位数?

JavaScript中的分位数/百分点/百分位数/逆累积分布函数

如何计算基于组的分位数?

如何计算列的每个值所在的百分位数? (Spark SQL)[重复]

python使用pandas中的groupby函数和agg函数计算每个分组数据的两个分位数(例如百分之10分位数和百分之90分位数)

Pandas .. 分位数函数是不是需要排序数据来计算百分位数?