如何使用 SQLite 找到第 N 个百分位数?

Posted

技术标签:

【中文标题】如何使用 SQLite 找到第 N 个百分位数?【英文标题】:How to find Nth percentile with SQLite? 【发布时间】:2010-11-10 13:10:45 【问题描述】:

我想找到第 N 个percentile。

例如:table:htwt;列:姓名、性别、身高、体重

结果:

| gender | 90% height | 90% weight |
| male   |        190 |         90 |
| female |        180 |         80 |

【问题讨论】:

【参考方案1】:

sqlite 的分析处理能力不强,但如果你的数据不是很大,你可以尝试用ORDER BYLIMIT 1 和计算得到的OFFSET 模拟百分位数。请注意,OFFSET 是从零开始的,因此您需要将其调整为 1。

SELECT
  height AS 'male 90% height'
FROM table
WHERE gender='male'
ORDER BY height ASC
LIMIT 1
OFFSET (SELECT
         COUNT(*)
        FROM table
        WHERE gender='male') * 9 / 10 - 1;

【讨论】:

“大”数据是什么意思?就表中的数据行数而言,这里的解决方案适用于什么范围?您能否详细说明如何计算的偏移量部分? 我不知道数据大小范围。如果它对你有用,很好。偏移量用于选择按高度排序的数据的 90% 处的行 - 还有另一个用于检索 male_count 的查询。【参考方案2】:

我需要多个百分比(10、20 ... 100%)并通过以下方式解决:

WITH p AS (SELECT height, NTILE(10) OVER (ORDER BY height) AS percentile
           FROM table
           WHERE gender = 'male')
SELECT percentile, MAX(height) as height
FROM p
GROUP BY percentile;

此解决方案需要 SQLite 3.28.0 或更高版本才能使用 NTILE 窗口函数。

【讨论】:

请注意,只有当垃圾箱的大小都相同或非常接近时,它才有效。例如,我使用ntile(100) 将我的表分成 100 个 bin,最终在 bin 1-55 中有 7 个样本,在 bin 56-100 中有 6 个样本。所以我所有的顶部垃圾箱只有底部垃圾箱的 6/7 (86%) 大小,这是一个很大的差异。

以上是关于如何使用 SQLite 找到第 N 个百分位数?的主要内容,如果未能解决你的问题,请参考以下文章

postgresql中的第n个百分位数计算

如何从 PHP 中的双精度数组中计算第 n 个百分位数?

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

如何在 numpy / scipy 中获取特定百分位数的索引?

查找名为 mag(地震震级)的列的百分位数

计算列中值的百分位数