2009-10-30 26 views
1

我有一個表,其中唯一相關的列是completionDate,這是一個項目被標記爲完成的時代之後的秒數。我想做一個select語句來計算完成的項目數量,按它們被標記爲完整的那一週進行分組。到目前爲止,我有這樣的事情:SQLite表達式來計算按行分組的行數

SELECT (completionDate-min)/(60*60*24*7) 
FROM 
    (SELECT min(completionDate) AS min 
    FROM TASK) 
LEFT JOIN task; 

它返回的結果:

0 
2 
2 
2 
3 
3 
3 

這意味着,1項是在第一週完成,3項是在第三完成和第四周。

我可以通過編程(特別是,本週的開始)爲min尋找更好的價值。我真正需要的是根據結果進行分組並計算結果數量的方法。理想的結果是:

0|1 
2|3 
3|3 

我的下一步是要試試這個:

SELECT COUNT(idx) 
FROM 
    (SELECT ((completionDate-min)/(60*60*24*7)) AS idx 
    FROM 
     (SELECT min(completionDate) AS min 
     FROM TASK) 
    LEFT JOIN task) 
GROUP BY idx; 

其中給出的結果是,在某種程度上,我不明白,看的那種類型的權利,但錯了:

0 
1 
3 
3 

在這一點上,我只是卡住了。我承認我的SQL並不是那麼棒,所以對我所擁有的任何優化都會感激不盡。

+1

加入 「IDX」 到select子句,找到奇數0計數:SELECT idx,COUNT(idx)... – 2009-10-30 18:46:57

回答

2
SELECT (completionDate - min)/(60*60*24*7) AS week, 
     COUNT(*) AS count 
FROM task, (SELECT MIN(completionDate) AS min FROM task) 
GROUP BY week 
HAVING completionDate NOT NULL; 
0

想通了。有一些空值。新增了WHERE completoinDate NOT NULL

SELECT idx, COUNT(idx) 
FROM 
    (SELECT ((completionDate-min)/(60*60*24*7)) AS idx 
    FROM 
     (SELECT min(completionDate) AS min 
     FROM TASK) 
    LEFT JOIN task WHERE completionDate NOT NULL) 
GROUP BY idx; 

請讓我知道它是否可以通過任何方式進行優化。

1

Source of data:

SELECT的strftime( '%Y%W',date_col上)爲W,other_data FROM MY_TABLE GROUP 由W

See http://sqlite.org/lang_datefunc.html for usage. That doc also 
includes some caveats related to precision and locale, etc.