SQL-запрос для получения подсчета количества элементов, имеющих каждое возможное значение для данного столбца.

Итак, у меня есть таблица (SQLite) с именем log, в которой один столбец (время) представляет собой отметку времени эпохи Unix (другие столбцы не имеют значения для моих целей). Это записи журнала с отметками времени.

Я пытаюсь подсчитать, сколько элементов регистрируется в час (за все время — мне все равно, делать это только для определенного дня или чего-то еще; я пытаюсь получить представление о плотности активности на протяжении всего средний день). Мне удалось в основном объединить их в часы с помощью запроса SELECT STRFTIME('%H', DATETIME(time, 'unixepoch', 'localtime')) FROM log;, который затем дает мне просто огромный список чисел 0-23, который я могу запустить через uniq -c, чтобы получить количество событий в час.

Однако (скорее из упрямства, чем из практической необходимости, я признаю) я хочу сделать этот этап подсчета в SQL. Мой мозг довел меня до того, что я знал, что мне, вероятно, придется выполнить какое-то самосоединение, чтобы получить только уникальные значения для сгенерированного столбца часов, но именно здесь он облажался. D: Есть идеи?


person tgies    schedule 25.09.2010    source источник


Ответы (2)


SELECT STRFTIME('%H', DATETIME(time, 'unixepoch', 'localtime')), 
COUNT(anotherField)
FROM log
GROUP BY STRFTIME('%H', DATETIME(time, 'unixepoch', 'localtime'));

Примечание. Я не работал с SQLite. Однако он поддерживает GROUP BY и, следовательно, это должно работать.

person shahkalpeshp    schedule 25.09.2010
comment
+1: GROUP BY требуется в стандартном SQL, но SQLite (как и MySQL) поддерживает скрытые столбцы - person OMG Ponies; 26.09.2010
comment
О, чувак, я совсем забыл о GROUP BY, это показывает, насколько я ржавый. Этот запрос может быть немного медленным, но для того, с чем я имею дело, это действительно очень хорошо. Кстати, наверное, лучше ВЫБРАТЬ STRFTIME(...) КАК час [...] СГРУППИРОВАТЬ ПО часу. - person tgies; 26.09.2010
comment
@tgies: я не знаю, поддерживает ли SQLite синтаксис типа GROUP BY hour, потому что я с ним не работал. Другие базы данных (например, SQL Server) не поддерживают псевдонимы столбцов в группе, IIRC. - person shahkalpeshp; 26.09.2010
comment
SQLite поддерживает группировку по псевдониму. Это лучший способ не попасть в крупную аварию. Если подумать, то же самое делают Oracle и MySQL, так что, возможно, именно SQL Server отличается тем, что не поддерживает его? - person MPelletier; 26.09.2010

зачем использовать COUNT (anotherField)?

Используйте 1_

person Benoit    schedule 25.09.2010