2011-11-01 67 views
1

我有兩張表。首先是用戶。訂戶也被指定爲一個類別。第二張表是用戶付款。我想知道訂閱時間和訂閱者的第一次付款之間的平均時間(可以是多次)。得到從訂閱到付款的平均時間

這裏是一塊SQL的,但它不會做我想做的,只是還沒有 - 雖然我有我接近的感覺;)

SELECT category, 
AVG(TIMESTAMPDIFF(HOUR, subs.timestamp, MIN(payments.timestamp))) 
FROM subs 
JOIN payments ON (payments.user_id = subs.user_id) 
GROUP BY category 

現在,我得到「無效使用組功能「 - 因爲MIN函數,所以這是不對的。我現在必須做什麼?提前致謝!

回答

2
SELECT category, 
AVG(TIMESTAMPDIFF(HOUR, subs.timestamp, p.timestamp)) 
FROM subs 
JOIN (SELECT user_id 
      , min(timestamp) timestamp 
     FROM payments 
     GROUP BY user_id 
    ) p 
ON p.user_id = subs.user_id 
GROUP BY category 

如果您需要更新與此查詢的結果另一個表,你可以做這樣的事情(未測試,所以可能有語法錯誤,但希望你的想法)。我認爲another_table有類別和avg_hrs_spent列。

UPDATE another_table 
    SET avg_hrs_spent = 
    (
     SELECT a.avg_hrs_spent FROM 
     (
     (SELECT category, 
       AVG(TIMESTAMPDIFF(HOUR, subs.timestamp, p.timestamp)) avg_hrs_spent 
      FROM subs 
      JOIN (SELECT user_id 
         , min(timestamp) timestamp 
        FROM payments 
        GROUP BY user_id 
       ) p 
      ON p.user_id = subs.user_id 
      GROUP BY category) a 
     ) 
     WHERE a.category = another_table.category 
    ) 
+0

我認爲正確的,必須做的,看到很多額外的查詢,如果數字是正確的壽:)一個問題:是什麼MIN(時間戳)時間戳做什麼呢? –

+0

在上面的查詢中,它獲取每個user_id的最小時間戳。然後,我們將這個結果加入到subs.user_id中,以便我們可以對所有user_id的每個類別取平均值。 – dcp

+0

酷!現在我想用此查詢的結果更新另一個表(其中包含有關每個用戶類別的其他信息)。我怎麼做? (或者我需要爲此發佈一個新問題...) –