【问题标题】:SQL query that returns aggregate AND non aggregate results返回聚合和非聚合结果的 SQL 查询
【发布时间】:2012-01-16 10:06:35
【问题描述】:

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

下面的示例应该有助于阐明我想要做什么。我在下面有以下(简化的)表格:

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 函数吗?理想情况下,这应该与 db 无关。但是,我使用的是 PostgreSQL 8.4,所以如果我必须在 SQL 风格之间进行选择,则优先。

【问题讨论】:

  • weight_apgh - 个人体重表示为平均身高的百分比?

标签: sql postgresql stored-procedures


【解决方案1】:

你需要使用window functions - 像这样:

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

【讨论】:

    【解决方案2】:

    这样的查询应该可以帮助您开始:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2014-10-22
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多