【发布时间】: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