2009-07-24 161 views
0

我對我的SQL很生疏,也許你可以幫我解決這個問題。在Postgres上使用日期的聚合函數

我有這兩個表一票系統(我省略某些字段):

表門票

id - bigint 
subject - text 
user_id - bigint 
closed - boolean 
first_message - bigint 

(外鍵,爲下表中的id)

last_message - bigint 

(與之前相同)

表ticket_messages

creation_date 

我需要查詢封閉票,並進行的第一條消息CREATION_DATE和最後的消息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 

我通過尋找一些團體或聚合函數來從表中的所有數據,並試圖計算出過去之間所花費的時間和第一個,也試圖顯示第一個和最後一個消息的日期。


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 

我想這樣做...

回答

1

類似這樣的事情應該做得到的日子過去了。您可能需要將其放入子查詢中,以便從「票證」中輕鬆提取更多字段。

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,sub.nr_days 
FROM (
    SELECT t.id,AVG(tlast.creation_date - tfirst.creation_date) as nr_days 
    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) AS sub 
INNER JOIN tickets AS t 
    ON sub.id = t.id; 
1

您正在嘗試兩個查詢合併成一個試圖從兩個表中得到三行數據的數據。兩者都需要修復。

首先,您不應該嘗試將彙總數據(例如平均值)與單個項目的詳細信息混合在一起 - 您需要對此進行單獨查詢。你可以這樣做,但輸出是重複的,因此浪費(組中的所有單個項目將具有相同的聚合數據)。

其次,您需要找到給定票證的第一條消息和最後一條消息。因此,該查詢是:

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,類型實際上是INTERVAL DAY(n),例如9)。

現在可以平均這些間隔。你不能平均日期,因爲日期不能加在一起,也不能分開;平均包括求和和分割。間隔可以被添加和劃分。