2009-10-30 68 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.