【问题标题】:Postgres - Calculating group percentile for individual objectPostgres - 计算单个对象的组百分位数
【发布时间】:2018-05-19 16:58:45
【问题描述】:

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

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,

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

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'

但没有骰子。我只是得到一个语法错误。

谢谢!任何对此进行排序的帮助将不胜感激。

【问题讨论】:

  • 您不需要在 over 子句中进行选择,您已经可以访问该表中的所有列,例如overall_score。

标签: sql json postgresql postgresql-9.3


【解决方案1】:

我想你只需要一个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';

【讨论】:

  • 嗯。我试过了,但它仍然返回 1,我认为是因为它按 group_id 划分了 1 个评估列表。有没有办法创建一个不同的 评估集(一个具有给定group_id 的所有评估和另一个具有给定user_id 的评估),并在这些集合上运行ntile 函数?
猜你喜欢
  • 1970-01-01
  • 2015-03-09
  • 2021-02-26
  • 2020-10-07
  • 2020-07-31
  • 2016-08-25
  • 2011-12-29
  • 2013-06-20
  • 2017-05-15
相关资源
最近更新 更多