我有一张桌子:
country(ID, city, freg, counts, date)
我想计算特定日期间隔($ min和$ max)的第90个百分位数。
我已经做了同样的事情,但平均值(代码如下):
SELECT
AVG(counts)
FROM country
WHERE date>= @min AND date < @max
;
如何计算第90个百分位而不是平均值?
答案 0 :(得分:1)
最后,GROUP_CONCAT适合......
SELECT SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(ct.ctdivol ORDER BY ct.ctdivol SEPARATOR ','),',',90/100 * COUNT(*) + 1
),',',-1
) `90th Percentile`
FROM ct
JOIN exam e
ON e.examid = ct.examid
AND e.date BETWEEN @min AND @max
WHERE e.modality = 'ct';
答案 1 :(得分:0)
似乎无法使用单个查询执行此操作。至少在MySQL中没有。
您可以在多个查询中执行此操作:
1)选择满足条件的行数。
SELECT
COUNT(*)
FROM exam
INNER JOIN ct on exam.examID = ct.examID AND ct.ctdivol_mGy > 0
WHERE exam.modality = 'CT'
AND exam.date >= @min AND exam.date < @max
2)通过将行数乘以百分位数/ 100来检查百分位数阈值。例如:
Number of rows in previous count: 200
Percentile: 90%
Number of rows to threshold: 200 * (90/100) = 180
3)重复查询,按照您想要百分位数的值和LIMIT
结果排序到您在第二点找到的唯一行号。像这样:
SELECT
ct.ctdivol_mGy
FROM exam
INNER JOIN ct on exam.examID = ct.examID AND ct.ctdivol_mGy > 0
WHERE exam.modality = 'CT'
AND exam.date >= @min AND exam.date < @max
ORDER BY ct.ctdivol_mGy
LIMIT 1 OFFSET 179 --> Take 1 row after 179 rows, so our 180th we need
您将获得所选行的第180个值,因此您需要的第90个百分位数。 希望这有帮助!