2013-02-03 75 views
0

我有一個查詢需要它來從兩個單獨的表中選擇兩個不同時間的平均時間差。多行的MySQL AVG TimeDiff

在查詢的下一部分進來之前,這看起來很容易:我必須根據學生進入辦公室的原因進行分組。所以現在這個查詢需要:

  1. 選擇的原因(爲什麼)
  2. 伯爵學生已經多少次進來這個原因計數(爲什麼)
  3. 然後,我需要檢查從AVG時間開始時間到結束時間。請記住,我是按原因分組的。這意味着我需要timediff來計算所有符合學生訪問原因的記錄差異。

我寫此查詢:

SELECT why, 
    count(why), 
    SEC_TO_TIME(AVG(MAX(support.finishtime) - session.signintime)) 
    FROM session 
    LEFT JOIN support 
     ON support.session_id = session.session_id 
    WHERE status = 3 
    GROUP BY why; 

但是我得到一個錯誤:

ERROR 1111(HY000):無效使用組功能的

我不t似乎理解這個問題。從閱讀過去他們正在考慮使用的問題?但我不明白在這種情況下如何甚至在何處添加having子句。

任何幫助將不勝感激。

謝謝

+0

嘗試取出MAX功能。我懷疑mySQL試圖使用MAX組而不是MAX函數 –

+0

以及我必須使用max,因爲每個會話(爲什麼與之相關)都有多​​個可以在其上工作的顧問。所以我希望登錄會話的開始時間(登錄時間)和結束時間的最後時刻,這將是時間戳的最大值(MAX)。 – RaGe10940

回答

0
SELECT 
session.why AS Reason, 
COUNT(session.why) AS Count, 
SEC_TO_TIME(AVG(TIMEDIFF(t.fin, session.signintime))) AS Time 
FROM session 
LEFT JOIN (SELECT support.session_id, MAX(support.finishtime) AS fin 
FROM support 
GROUP BY support.session_id) AS t 
    ON session.session_id = t.session_id 
WHERE session.status = 3 
GROUP BY session.why 
ORDER BY session.signintime DESC 

這完美地完成了這項工作!我剛剛幾個小時前就明白了,我從來沒有真正使用過子查詢,所以我的教授幫助我解決了這個問題。

0

好吧,看在這一點,我在想,你想要的是一個嵌套查詢來獲取最大的支持記錄。要做到這一點

一種方法是:

SELECT why, 
    count(why), 
    SEC_TO_TIME(AVG((select max(finishtime) from 
       support where support.session_id = session.session_id) - 
     session.signintime)) 
    FROM session 
    WHERE status = 3 
    GROUP BY why; 

我已經創建SQL Fiddle,所以你可以看一下,我用的是表結構。

+0

不,我需要得到一個學生在辦公室裏的平均時間。選擇完成時間不成問題,當我必須對兩者進行平均和時間差時,問題就出現了。那是我堅持的地方。 – RaGe10940

+0

你可以在SQLFiddle中發佈你的模式,一些數據和預期的結果嗎? –