Postgresql Postgres上带有日期的聚合函数

Postgresql Postgres上带有日期的聚合函数,postgresql,select,aggregate-functions,Postgresql,Select,Aggregate Functions,我对SQL有些生疏,也许你可以帮我解决这个问题 我有两个用于票证系统的表(我省略了一些字段): 餐桌票 id - bigint subject - text user_id - bigint closed - boolean first_message - bigint creation_date (外键,用于下一个表的id) (同上) 表格票证信息 id - bigint subject - text user_id - bigint closed - boolean first_mes

我对SQL有些生疏,也许你可以帮我解决这个问题

我有两个用于票证系统的表(我省略了一些字段):

餐桌票

id - bigint
subject - text
user_id - bigint
closed - boolean
first_message - bigint 
creation_date
(外键,用于下一个表的id)

(同上)

表格票证信息

id - bigint
subject - text
user_id - bigint
closed - boolean
first_message - bigint 
creation_date
我需要查询已关闭的票证,并计算第一个邮件创建日期和最后一个邮件创建日期之间的平均时间。这就是我到目前为止所做的:

SELECT t.id, t.subject, tm.creation_date
FROM tickets AS t
INNER JOIN ticket_messages AS tm
ON tm.id = t.first_message
OR tm.id = t.last_message
WHERE t.closed = true
我正在寻找一些groupby或aggregate函数来获取表中的所有数据,并尝试计算上一次和第一次之间花费的时间,同时尝试显示第一次和最后一次消息的日期


UPDATE我添加了一个与第二个表的内部联接,而不是“OR”,现在我得到了两个日期,我可以从我的应用程序中找到总和:

SELECT t.id, t.subject, tm.creation_date, tm2.creation_date
FROM tickets AS t
INNER JOIN ticket_messages AS tm
ON tm.id = t.first_message
INNER JOIN ticket_messages as tm2
ON tm2.id = t.last_message
WHERE t.closed = true

我想是这样的…

像这样的事情应该可以得到天数。您可能需要将其放入子查询中,以便轻松地从“tickets”中提取更多字段

SELECT t.id,AVG(tlast.creation_date - tfirst.creation_date)
  FROM tickets AS t
INNER JOIN ticket_messages AS tfirst
  ON tm.id = t.first_message
INNER JOIN ticket_messages AS tlast
  ON tm.id = t.last_message
WHERE t.closed = true
GROUP BY t.id
这可能导致(未测试…)例如


您正在尝试将两个查询合并为一个查询,并尝试从两个表的三行数据中获取数据。两者都需要修复

首先,您不应该尝试将聚合数据(如平均值)和单个项目的详细信息混合在一起——您需要单独的查询。您可以这样做,但输出是重复的,因此是浪费的(一个组中的所有单个项将具有相同的聚合数据)

其次,您需要找到给定票证的第一条消息和最后一条消息。因此,该查询是:

SELECT t.id, t.subject, tm1.creation_date as start, tm2.creation_date as end,
       tm2.creation_date - tm1.creation_date as close_interval
  FROM            tickets AS t
       INNER JOIN ticket_messages AS tm1 ON t.last_message = tm1.id
       INNER JOIN ticket_messages AS tm2 ON t.last_message = tm2.id
 WHERE t.closed = true
这将根据需要为每个结果行提供三行数据。计算出的值应该是区间类型——假设PostgreSQL实际具有该类型。(在Informix中,对于合适的n,例如9,类型实际上是INTERVAL DAY(n)

你现在可以平均这些时间间隔了。您不能平均日期,因为日期不能相加,也不能分割;平均包括求和和和除法。可以添加和划分间隔