我需要编写一个返回表中聚合和非聚合数据的查询。
以下示例应该有助于澄清我正在尝试做的事情。我有以下(简化)表格:
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风格之间做出选择,那么这将优先。
答案 0 :(得分:7)
你需要使用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
答案 1 :(得分: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