【问题标题】:CACULATE MIN, MEDIAN, MAX AT ONCE一次计算最小值、中值和最大值
【发布时间】:2020-12-23 12:53:54
【问题描述】:

请帮助我从结果表中一次计算学生的 MIN、MEDIAN 和 MAX 分数。结果表:id、student_id、score

我找到了使用以下代码获取中值的方法,但它仅返回中值。我怎样才能添加最小值和最大值?非常感谢

SELECT AVG(SCORE)::INT AS MEDIAN
FROM

(SELECT *, 
row_number() over(order by score desc) as desc_sc,
row_number() over(order by score asc) as asc_sc
FROM result
) as a

WHERE asc_sc IN (desc_sc,desc_sc+1,desc_sc-1)

【问题讨论】:

  • 请帮助我们了解更多信息。你的数据库是什么?
  • 嗨@VBoka,谢谢你的提问。实际上我给了你“结果表:id,student_id,score”。另外,我很新,所以希望你能告诉我你还需要什么。
  • 嗨@HoangNhi 对不起,我不明白你的回答。我问了你的数据库。此外,我们需要查看您希望通过查询获得的数据,而不是这样:“结果表:id,student_id,score”。我们想看看您在执行查询后希望获得哪些数据。结果表是您的源表。该表中有一些数据吗?向我们展示该表中的几行以及您希望从该数据中获得的结果。另外,再来一次,您使用什么数据库:Oracle、SQLServer、MySQL....让我们知道...
  • 嗨@HoangNhi 任何反馈都会很好。你有两个答案,他们好吗?是的,太好了,如果您愿意,请接受它们...如果没有,请评论为什么不...干杯!
  • 对于迟到的回复,我深表歉意。第一个答案帮助我修复了我的错误代码,我也感谢第二个答案中百分位数的想法。感谢您的评论,下次我肯定会给出更清晰的示例输入和预期输出问题。最好的问候!

标签: sql max min median


【解决方案1】:

你可以试试:

SELECT AVG(SCORE)::INT AS MEDIAN, min_score, max_score
FROM

(SELECT *, 
MIN(score) over (ORDER BY score ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as min_score,
MAX(score) over (ORDER BY score ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as max_score,
row_number() over(order by score desc) as desc_sc,
row_number() over(order by score asc) as asc_sc
FROM result
) as a

WHERE asc_sc IN (desc_sc,desc_sc+1,desc_sc-1)

【讨论】:

    【解决方案2】:

    你可以使用这样的语法:

    SELECT DISTINCT 
            MIN(score) OVER () as min_score,
            MAX(score) OVER () as max_score,
            PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY SCORE) OVER () as median 
    FROM result;
    

    一些数据库支持median() 函数。在这些数据库中,您可以使用:

    SELECT MIN(score) as min_score, MAX(score) as max_score,
           MEDIAN(score) as median_score
    FROM result;
    

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 2015-12-03
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多