postgres-选择另一张表的特定行并将其存储为列

时间:2019-01-01 15:05:07

标签: sql postgresql

我有一个timeTracks表,其中记录了另一个名为project的表的startTime和stopTime属性。

通过以下汇总,我设法显示了属于一个项目的轨道数量的总数。如果存在活动的Track(一个没有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 :(得分:1)

您可以使用聚合功能:

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表达式。