我需要编写一个从表中返回聚合和非聚合数据的查询。
下面的示例应该有助于阐明我正在尝试做的事情。我有以下(简化的)表格:
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
);
为了论证,我们假设每个学生都属于一个且唯一的类(class)组。我想编写一个将返回如下结果集的查询:
student.name, student.weight, weight_apgaw, weight_apgh
地点:
weight_apgaw: 是个别学生的体重,表示为他/她所属类(class)组平均体重的百分比。
weight_apgh: 是个别学生的体重,表示为他/她所属类(class)组平均高度的百分比
对于如何编写这样的查询,我完全没有想法(当然有些想法)。我的方法是编写两个查询,并以某种方式在两个表之间进行查找 - 但这种方法充其量似乎是荒谬且低效的。
有人可以建议我如何正确编写这样的 SQL 函数吗?理想情况下,这应该与数据库无关。但是,我使用的是 PostgreSQL 8.4,因此如果我必须在 SQL 风格之间进行选择,则优先考虑。
最佳答案
您需要使用 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
关于返回聚合和非聚合结果的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8878402/