SQL-запрос, который возвращает агрегированные и не агрегированные результаты - PullRequest
4 голосов
/ 16 января 2012

Мне нужно написать запрос, который возвращает как агрегированные, так и неагрегированные данные из таблицы.

Пример, приведенный ниже, должен помочь уточнить, что я пытаюсь сделать. У меня есть следующие (упрощенные) таблицы ниже:

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
          );

Ради аргумента давайте предположим, что каждый студент принадлежит к одной и той же группе курсов. Я хочу написать запрос, который будет возвращать набор результатов следующим образом:

имя студента, вес студента, вес_папки, вес_апг

Где:

weight_apgaw: - это вес отдельного студента, выраженный в процентах от среднего веса группы курса, к которой он / она принадлежит.

weight_apgh: это вес отдельного студента, выраженный в процентах от среднего роста группы курса, к которой он / она принадлежит

У меня НЕТ идеи (ну, есть идея) о том, как написать такой запрос. Мой подход состоит в том, чтобы написать два запроса и каким-то образом выполнить поиск между двумя таблицами, но такой подход в лучшем случае кажется бессмысленным и неэффективным.

Может, кто-нибудь подскажет, как правильно написать такую ​​функцию SQL? В идеале, это должно быть независимым от БД. Однако я использую PostgreSQL 8.4, поэтому, если мне нужно выбирать между разновидностями SQL, это имеет приоритет.

Ответы [ 2 ]

7 голосов
/ 16 января 2012

Вам нужно использовать оконные функции - вот так:

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 голосов
/ 16 января 2012

запрос по этим направлениям должен помочь вам начать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...