SQL - JOIN на две таблицы результатов, идеи для рефакторинга? - PullRequest
2 голосов
/ 31 декабря 2011

Возможно, об этом уже спрашивали, но StackOverflow огромен, и попытка найти что-то достаточно конкретное, чтобы действительно помочь, - это кошмар!

Я закончил с довольно большим запросом SQL, и мне было интересно, может ли SO указать на более простые методы, которые я мог бы пропустить.

У меня есть таблица с именем usage со следующей структурой:

host    | character varying(32)       | 
usage   | integer                     | 
logtime | timestamp without time zone | default now()

Я хочу получить значение использования как для MAX, так и для MIN logtimes. Проработав некоторые из моих старых учебников (некоторое время назад я действительно правильно использовал SQL), я получил следующее JOIN:

SELECT *
FROM (SELECT u.host,u.usage AS min_val,r2.min
  FROM usage u
  JOIN (SELECT host,min(logtime) FROM usage GROUP BY host) r2
  ON u.host = r2.host AND u.logtime = r2.min) min_table
NATURAL JOIN (SELECT u.host,u.usage AS max_val,r1.max
  FROM usage u
  JOIN (SELECT host,max(logtime) FROM usage GROUP BY host) r1
  ON u.host = r1.host AND u.logtime = r1.max) max_table
;

Это похоже на грязный способ сделать это, поскольку я в основном выполняю один и тот же запрос дважды, один раз с MAX и один раз с MIN. Я могу получить оба столбца времени журнала в одном запросе, выполнив SELECT usage,MAX(logtime),MIN(logtime) FROM ..., но не могу понять, как затем отобразить значения использования, которые соответствуют двум различным записям.

Есть идеи?

1 Ответ

3 голосов
/ 31 декабря 2011

В PostgreSQL 9.1 у вас есть оконные функции (8.4 +):

SELECT DISTINCT
       u.host
      ,first_value(usage) OVER w AS first_usage
      ,last_value(usage) OVER w AS last_usage
FROM   usage u
WINDOW w AS (PARTITION BY host ORDER BY logtime, usage
             ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)

Я сортирую раздел по logtime и usage, чтобы разорвать любые связи и получить стабильный результат. Прочитайте о оконных функциях в руководстве .

Для получения дополнительных объяснений и ссылок вы можете обратиться к последним связанным ответам здесь или здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...