返回聚合和非聚合结果的SQL查询

4

我需要编写一个查询,从表中返回聚合和非聚合数据。

下面的示例应该有助于澄清我的意图。我有以下(简化)表格:

CREATE TABLE course_group_def (
          id        PRIMARY SERIAL KEY,
          name      TEXT NOT NULL
          );

CREATE TABLE student (
          id        PRIMARY SERIAL KEY,
          grp_id    INTEGER REFERENCES course_group_def(id) ON UPDATE CASCADE,
          name      TEXT NOT NULL,
          weight    float NOT NULL,
          height    float NOT NULL
          );

假设每个学生只属于一个课程组,请按以下格式返回结果集的查询:
"student.name, student.weight, weight_apgaw, weight_apgh"
其中:
"weight_apgaw":是单个学生的体重,以他/她所属课程组的平均体重的百分比表示。
"weight_apgh":是单个学生的体重,以他/她所属课程组的平均身高的百分比表示。
我不知道如何编写这样的查询,我的想法是编写两个查询,并在两个表之间进行查找,但这种方法似乎毫无意义且效率低下。请建议正确编写此类SQL函数的方法。最好该方法应该与数据库无关,但我正在使用PostgreSQL 8.4,因此如果必须选择SQL语言,则以该语言为准。

weight_apgh - 个人体重,以平均身高的百分比表示? - user359040
2个回答

7

您需要使用窗口函数,如下所示:

select name,
       weight,
       height,
       100 * weight / avg(weight) over (partition by grp_id) weight_apgaw,
       100 * weight / avg(height) over (partition by grp_id) weight_apgh
from student

3
以下查询可以帮助你入门:

select s.name
     , s.weight
     , ((s.weight/st.avgweight) * 100) as weight_apgaw
     , ((s.height/st.avgheight) * 100) as weight_aphei
from student s 
join (
   select grp_id
        , avg(weight) as avgweight
        , avg(height) as avgheight
   from student
   group by grp_id
   ) st on s.grp_id = st.grp_id

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接