2015-02-05 58 views
0

表sca_ticket_thread存儲狀態更改日期。我試圖計算兩個狀態之間的平均時間差。 「已創建」列存儲狀態更改的日期,「正文」列存儲狀態更改。計算同一張表上的行之間的平均時間差

SELECT AVG(DateDiff((SELECT created FROM 
(SELECT created 
FROM sca_ticket_thread 
WHERE body = 'AchangetoB' 
OR body = 'BchangetoC' 
GROUP BY ticket_id 
HAVING count(*) > 1) 
as subquery), 
(SELECT created 
FROM sca_ticket_thread 
WHERE body = 'BchangetoC' 
ORDER BY ticket_id))) 
FROM sca_ticket_thread 

我收到的錯誤是:#1242 - 子查詢返回多個1行

我(在概念上,一點點)瞭解到,子查詢不能返回超過1行。我已經考慮加入一張表作爲一種可能的解決方案,但我認爲這不是正確的道路。

最後,我想生成從A到B的平均狀態的變化,B到C到d等

ID | STATUS | DATE 
-------------------------- 
1 | Status A | 02/01/2015 
1 | Status A | 02/02/2015 
2 | Status B | 02/03/2015 
+0

運行的兩個子查詢,看看他們返回的內容。我無法回想一下子查詢可以返回多少行的限制。例如:'SELECT * FROM X WHERE x_id IN(SELECT x_id FROM X where x_value LIKE'foo%');'完全有效,子查詢可以返回多行。有些選項可以實現你想要的功能,包括:LIMIT,GROUP,MAX,MIN等等。 – nevets1219

+0

第一個select語句返回24行,第二個是17.這是問題嗎? – Duke

+0

是的。 DateDiff只需要兩個參數。您需要過濾掉其他行以獲得您想要的。此外,您應該確保多個'AchangetoB'和'BchangetoC'是有效的,如果不是,您可能會收緊架構以防止出現這種情況。 – nevets1219

回答

0

讓我們來看看你的最新查詢:

SELECT AVG(DateDiff(
    (SELECT created FROM (
    SELECT ticket_id, created, body 
    FROM sca_ticket_thread 
    WHERE body = 'AchangetoB' OR body = 'BchangetoC' 
    GROUP BY 1 
    HAVING count(*) > 1) as subquery), 
    (SELECT created FROM sca_ticket_thread WHERE body = 'BchangetoC' ORDER BY ticket_id))) 
FROM sca_ticket_thread 

幾個問題脫穎而出:

  1. 您的子查詢正在返回多個列(ticket_id,created和body),但實際上並沒有使用他們所以你應該檢索created。不是一個實際的問題,但它確實會影響性能,所以你應該牢記這一點。
  2. 我不知道GROUP BY 1,但它是有效的(每天學習新東西)。在這種情況下,它基本上意味着GROUP BY ticket_id(您的SELECT中的第一列)。我不認爲這是有效的,因爲您正在選擇3列,但只是按1列分組。
  3. 我想你只是試圖將響應限制在HAVING的一行上,但在這種情況下,這意味着返回的結果給我的結果,其ticket_id出現多次。

我的MySQL有點生疏,但我認爲是對的。

我覺得我很困惑,但你可能需要做的不是使用子查詢,而是使用分組和/或連接。也許您可以使用您在查詢中提供的模式發佈簡短示例。諸如http://sqlfiddle.com/對於查看問題和自己調試的人來說非常方便。

還有一些其他的答案可能會有所幫助: