我的应用有评估表。每项评估都会对各个级别的人进行评分,并与一个组相关联。所以像这样:
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'
但没有骰子。我刚收到语法错误。
谢谢!任何帮助整理这个将非常感激。
答案 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';