SQLite выражение для подсчета строк, сгруппированных по неделям - PullRequest
1 голос
/ 30 октября 2009

У меня есть таблица с единственным релевантным столбцом, представляющим завершение, через несколько секунд после эпохи, когда элемент был отмечен как завершенный. Я хотел бы сделать оператор 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-ю недели.

Я могу найти лучшее значение для 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 не так уж хорош, поэтому любая оптимизация того, что у меня есть, также будет оценена.

Ответы [ 3 ]

2 голосов
/ 30 октября 2009
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 голос
/ 21 декабря 2011

Источник данных:

SELECT strftime ('% Y% W', date_col) AS w, other_data FROM my_table GROUP BY

See http://sqlite.org/lang_datefunc.html for usage. That doc also
includes some caveats related to precision and locale, etc.
0 голосов
/ 30 октября 2009

Разобрался. Имел некоторые нулевые значения. Добавлено 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;

Пожалуйста, дайте мне знать, если это можно оптимизировать каким-либо образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...