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

标签 sql postgresql stored-procedures

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

下面的示例应该有助于阐明我正在尝试做的事情。我有以下(简化的)表格:

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/

相关文章:

postgresql - 使用 PSQL 命令查找主机名和端口

sql - 存储过程创建的临时表可以在另一个存储过程中使用吗?

MySQL:存储过程中准备好的语句 - 参数错误 1064

sql - 将查询转换为存储过程

sql - 根据计算值选择,优化

sql - 来自 SQL 查询的奇怪行为

php - 如何使用php将重音字母输入到mysql数据库中?

sql - 为什么 "WITH"子句会在 Informix 上给出语法错误?

sql - 重构字段的外键

r - PostGIS 和 R - 更快、更小地获取数据