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

Posted

技术标签:

【中文标题】postgres - 选择另一个表的一个特定行并将其存储为列【英文标题】:postgres - select one specfic row of another table and store it as column 【发布时间】:2019-01-01 15:05:06 【问题描述】:

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

通过以下聚合,我设法显示了属于一个项目的轨道数量的计数和总和。如果存在活动轨道(一个没有 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"

从技术上讲,一次只能有一个活动曲目。但是为了以防万一,它应该只选择最新的活动轨道,如果有两个轨道没有停止时间。

我怎样才能在 postgres 中做到这一点?

【问题讨论】:

您的查询是否有group by?样本数据和期望的结果会有所帮助。 【参考方案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 表达式。

【讨论】:

谢谢,这就是我要找的!每次我想选择另一个属性时,我都必须重复吗?例如。如果我想要另一个用于 activeTimeTrackStartTime 或 activeTimeTrackCreatedAt 的列,是否必须复制整个聚合? @韩车。 . .这是最简单的方法。如果您想要整个记录,还有其他方法也可以。 您能不能这么好心,只是指出其他方法的名称或参考,以便我查找它们?上面的例子只是我挑战的一个简化问题。现实中的轨迹表是一个包含更多元信息的视图,我还希望将其显示为附加列。因此,我宁愿只聚合一次并获得正确的最新活动曲目。 @韩车。 . .问另一个问题,解释你想做什么。您可以参考这个问题,以便区分答案。 完成了,但我不确定标题有多准确 .. :) ***.com/questions/53996994/…

以上是关于postgres - 选择另一个表的一个特定行并将其存储为列的主要内容,如果未能解决你的问题,请参考以下文章

POSTGRES:如何仅在另一个值不存在时选择具有某个值的行,在这种情况下选择另一个值?

使用 Apache Airflow 更新和维护 postgres 表

带有循环的 Postgres SQL 脚本

如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列

SQL 选择由 Ids 标识并由另一个表中的特定类型过滤的行列表中的所有第一项

插入行并获取其id并将该id插入另一个表的存储过程