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 表
如何在特定模式中的所有表的选择列表中获取总行数和最大(时间戳)列