Postgres - 计算单个对象的组百分位数

时间:2017-12-05 22:25:46

标签: sql json postgresql postgresql-9.3

我的应用有评估表。每项评估都会对各个级别的人进行评分,并与一个组相关联。所以像这样:

id: 'some-assessment',
user_id: 'some-user',
group_id: 'some-group',
overall_score: 98,
speed_score: 99,
vision_score: 97

从数据库中提取评估时,我想计算每个分数相对于同一用户或组的其他分数的统计信息,作为返回对象的一部分。在中,我想返回以下内容:

id: 'some-assessment',
user_id: 'some-user',
group_id: 'some-group',
overall_score: 98,
overall_score_user_percentile: 75, // ie, this score is in the 75th percentile of this users's other scores
overall_score_group_percentile: 60, // 60th percentile for group
speed_score: 99,
speed_score_user_percentile: 72,
speed_score_group_percentile: 63,
vision_score: 97,
vision_score_user_percentile: 71,
vision_score_group_percentile: 65,

我尝试通过生成以下查询来进行探索(基于在this question的答案中使用ntile

SELECT
  asmt.*,
  ntile(100) OVER (ORDER BY overall_score) AS overall_score_group_percentile
FROM
  assessments asmt
WHERE
  asmt.id='some-assessment'
  

请注意,这还没有包含实际将overall_score_group_percentile限制为群组内其他评估的逻辑。

我已经遇到了一个问题,就是overall_score_group_percentile似乎计算了当前评估中当前评估的百分位数 - 这只是当前的评估。

  

换句话说,我只是在一个评估本身的列表中计算评估的百分位数。我希望希望在更宽的指定列表(用户评估或组的列表)中进行计算。

所以我总是将1作为overall_score_group_percentile

如何计算此评估的百分等级与某些其他评估集合的任何想法?

我也试过这个,试图将比较组扩展到完整的评估表(在我尝试通过group_id缩小它之前):

SELECT
  asmt.*,
  ntile(100) OVER (SELECT overall_score FROM assessments ORDER BY overall_score) AS overall_score_group_percentile
FROM
  assessments asmt
WHERE
  asmt.id='some-assessment'

但没有骰子。我刚收到语法错误。

谢谢!任何帮助整理这个将非常感激。

1 个答案:

答案 0 :(得分:0)

我认为你只需要一个partition by

SELECT asmt.*,
       ntile(100) OVER (PARTITION BY group_id ORDER BY overall_score) AS overall_score_group_percentile
FROM assessments asmt
WHERE asmt.id = 'some-assessment';