SQL - 百分位数

时间:2016-01-28 15:02:09

标签: mysql sql

我有一张桌子:

country(ID, city, freg, counts, date) 

我想计算特定日期间隔($ min和$ max)的第90个百分位数。

我已经做了同样的事情,但平均值(代码如下):

SELECT
      AVG(counts)
FROM country
WHERE date>= @min AND date < @max
      ;

如何计算第90个百分位而不是平均值?

2 个答案:

答案 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个百分位数。 希望这有帮助!