Postgres Вид / Функция - PullRequest
       5

Postgres Вид / Функция

0 голосов
/ 08 марта 2012

Я пытаюсь создать представление, которое объединяет 2 таблицы, но результаты зависят от запроса. Вот пример того, чего я хочу достичь.

У меня есть таблица с именем sessionaccounting и таблица с именем sessionaccountingdailysplit .

sessionaccounting содержит все наши бухгалтерские данные, а sessionaccountingdailysplit - это данные сеанса, учитываемые по дате. К ним присоединяется внешний ключ sessionaccountingid

Как две таблицы работают в унисон следующим образом:

для строки в сеансе с учетом:

время начала - '2012-01-01', время окончания - '2012-01-03', использование - 10000

для строк в сеансе с учетом dailysplit:

дата - '2012-01-01', использование - 3000

дата - '2012-01-02', использование - 5000

дата - '2012-01-03', использование - 2000

Теперь я хочу, чтобы я запустил представление под названием vw_sessionaccounting как

SELECT * 
FROM vw_sessionaccounting 
WHERE starttime >= '2011-01-01' AND starttime <= '2011-01-02';

он должен только суммировать первые две даты из sessionaccountingdailysplit и заменять использование в sessionaccounting соответственно для каждой произведенной строки. (в большинстве случаев sessionaccountingdailysplit не будет строки, так как не было разделения)

Так же, как и выше, если я бегу

SELECT * 
FROM sessionaccounting 
WHERE starttime >= '2011-01-01' AND starttime <= '2011-01-02';

Я получу результат

время начала - '2012-01-01', время окончания - '2012-01-03', использование - 10000

но если я выполню запрос

SELECT * 
FROM vw_sessionaccounting 
WHERE starttime >= '2011-01-01' 
AND starttime <= '2011-01-02';

Я получу результат

время начала - '2012-01-01', время окончания - '2012-01-03', использование - 8000

1 Ответ

2 голосов
/ 09 марта 2012

Ваш вопрос несколько расплывчат в нескольких отношениях. Но из того, что я понял и догадался, ваш запрос (представление) может выглядеть так:

SELECT s.starttime
      ,s.endtime
      ,COALESCE(max(sd.date), s.endtime) AS effective_endtime_max_2_days
      ,COALESCE(sum(sd.usage), s.usage) AS usage_max_2_days
FROM   sessionaccounting s
LEFT   JOIN sessionaccountingdailysplit sd USING (sessionaccountingid)
WHERE  sd.sessionaccountingid IS NULL  -- no split ..
   OR  (starttime + 2) > sd.date -- .. or only the first two days of the split

GROUP BY s.starttime, s.endtime

Основные баллы

  • Используйте LEFT JOIN, потому что:

... в большинстве случаев сессия-сеансdailysplit не имеет строки, поскольку не было разделения

  • Включают только первые два дня: (starttime + 2) > sd.date

  • Обязательно включайте сеансы без слюны: WHERE sd.sessionaccountingid IS NULL OR

  • Используйте псевдонимы таблиц, чтобы убрать названия ваших чудовищных таблиц:
    FROM sessionaccounting s

  • sum() использование в течение первых двух дней. Если не было плевка, возьмите оригинальное общее использование вместо: COALESCE(sum(sd.usage), s.usage) AS usage_max_2_days

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