我有一张表,唯一相关的列是completionDate,这是一个项目标记为完成的纪元之后的秒数。我想做一个select语句来计算完成的项目数,按标记完成的那一周分组。到目前为止,我有这样的事情:
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周和第4周完成了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不是很好,所以对我所拥有的任何优化也会受到赞赏。
答案 0 :(得分: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;
答案 1 :(得分:1)
SELECT strftime('%Y%W',date_col)AS w,other_data FROM my_table GROUP by w
See http://sqlite.org/lang_datefunc.html for usage. That doc also
includes some caveats related to precision and locale, etc.
答案 2 :(得分: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;
如果能以任何方式进行优化,请让我知道。