postgres - выбрать одну конкретную строку другой таблицы и сохранить ее в виде столбца - PullRequest
0 голосов
/ 01 января 2019

У меня есть таблица для timeTracks со свойствами startTime и stopTime, которые записаны для другой таблицы с именем project.

Со следующими агрегатами мне удалось отобразить количество и сумму количества дорожек, которые принадлежатпроект.Если существует активный трек (один без stopTime), я хочу 2 дополнительных столбца с именами «activeTrackId» и «activeTrackStartTime».

SLECT
count(time_track."timeTrackId") AS "timeTracksTotalCount",
floor(date_part('epoch'::text, sum(time_track."stopTime" - time_track."startTime")))::integer AS "timeTracksTotalDurationInSeconds"
activeTimeTrackId ??
activeTimeTrackStartTime ??
...
FROM project
LEFT JOIN time_track on time_track."fkProjectId" = project."projectId"

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

Как это можно сделать в postgres?

1 Ответ

0 голосов
/ 01 января 2019

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

SELECT count(t."timeTrackId") AS "timeTracksTotalCount",
       floor(date_part('epoch'::text, sum(t."stopTime" - t."startTime")))::integer AS "timeTracksTotalDurationInSeconds"
       (array_agg(t."timeTrackId" order by t."startTime" desc) filter (where t."stopTime" is null))[1] as activeTimeTrackId,
       max(t."startTime") filter (where t."stopTime" is null) as activeTimeTrackStartTime 
...
FROM project p LEFT JOIN
     time_track t
     ON t."fkProjectId" = p."projectId"
GROUP BY ?;

Обратите внимание, что Postgres не предлагает функцию агрегации first(), поэтому она использует агрегацию массива, а затем берет первый элемент.

Если вы используете более старую версию Postgres, filter может быть недоступно.Вы можете заменить это на case выражений.

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