我有一个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中做到这一点?
答案 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
表达式。