在SQL中计算百分位数

6

这应该是非常简单的,但作为SQL的新手,我确实很困难。我被建议使用PERCENTILE_CONT以处理连续(非离散)数据。

所涉及到的数据包括两个列:(1)患者列表的ID和(2)每年平均事件数量。

从我在网上找到的一些代码开始,我现在的进展如下:

SELECT ID,
percentile_cont (0.25) WITHIN GROUP
(ORDER BY PPPY ASC) OVER(PARTITION BY ID) as percentile_25,
percentile_cont (0.50) WITHIN GROUP
(ORDER BY PPPY ASC) OVER(PARTITION BY ID) as percentile_50,
percentile_cont (0.75) WITHIN GROUP
(ORDER BY PPPY ASC) OVER(PARTITION BY ID) as percentile_75
FROM AE_COUNT;

这似乎只是报告了三列,每列的值都相同为 PPPY。

你有什么想法我做错了什么吗?


1
按ID分区 我猜你想要为其他东西进行分区。如果ID是唯一/主键,则每个组只有一个值。 - Lukasz Szozda
非常好!我已经添加了一个等于一的列并使用它。谢谢你。有没有更好的方法来计算整个样本的百分位数,供我以后参考? - user518206
如果您想要整体值,可以使用 OVER()。这适用于任何窗口函数。 - Manngo
2个回答

3
假设您想获取整个表格的百分位数,请尝试以下操作:
SELECT Distinct
percentile_cont (0.25) WITHIN GROUP
(ORDER BY PPPY ASC) OVER() as percentile_25,
percentile_cont (0.50) WITHIN GROUP
(ORDER BY PPPY ASC) OVER() as percentile_50,
percentile_cont (0.75) WITHIN GROUP
(ORDER BY PPPY ASC) OVER() as percentile_75
FROM AE_COUNT;

移除分区语句将针对整个表运行。我还从选择语句中删除了Id列并使其唯一。

我还想指出,您说第二列是每年事件的平均数。我不知道您需要百分位数做什么,但请注意,计算一组集合平均值的百分位数与计算这些集合的并集的百分位数不会得到相同的结果。


看起来我最初在问题上错过了Oracle标签。我不认为Oracle需要Over子句,所以你可以完全省略它。其他SQL实现可能需要它。 - Robert Corell

1

PERCENTILE_CONT() 是一个窗口函数或聚合函数。如果您希望对所有数据进行单行汇总,则将其用作聚合函数:

SELECT percentile_cont(0.25) WITHIN GROUP (ORDER BY PPPY ASC)  as percentile_25,
       percentile_cont(0.50) WITHIN GROUP (ORDER BY PPPY ASC) as percentile_50,
       percentile_cont(0.75) WITHIN GROUP (ORDER BY PPPY ASC) as percentile_75
FROM AE_COUNT;

如果您想要每位患者的价值,您需要执行以下操作:
SELECT id, percentile_cont(0.25) WITHIN GROUP (ORDER BY PPPY ASC)  as percentile_25,
       percentile_cont(0.50) WITHIN GROUP (ORDER BY PPPY ASC) as percentile_50,
       percentile_cont(0.75) WITHIN GROUP (ORDER BY PPPY ASC) as percentile_75
FROM AE_COUNT
GROUP BY id;

然而,患者可能只有很少的行,因此对于任何给定的患者,这些值很可能是相同的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接