Оператор SQL для сбора данных по дням и часам - PullRequest
2 голосов
/ 16 декабря 2008

У меня есть база данных, которая обновляется 200-1000 новых строк в день. Теперь я хотел бы иметь SQL-оператор, который возвращает данные изо дня в день, час за часом, чтобы я мог дать приблизительную оценку для текущего тренда, т.е. сколько строк будет добавлено в базу данных сегодня просто взглянем на эти исторические графики.

Итак, скажем, что я хотел бы распечатать 10 графиков за последние 10 дней с суммированием данных за каждый час, например:

День 9: 21,24,15,18, ..., 30,28,25: итог 348 (количество строк в час для дня 9 и всего) День 8: 32,37,38,43, ..., 45,55,65: сумма 442 (количество строк в час для дня 8 и всего) ... ... Day0: 18,25,28, X, Y ...: tot 'S' (статистика на сегодня. Что будет S?)

Как будет выглядеть SQL-оператор для сбора данных таким образом, изо дня в день, час за часом?

Вместо того, чтобы визуально смотреть на графики, чтобы дать приблизительную оценку сегодняшнего суммарного «S», еще лучше было бы вычислить прогноз «S». Но это была бы совсем другая проблема, я думаю ... Любые советы о том, как это сделать, или советы, где я могу получить больше информации, будут очень благодарны!

Спасибо, / Tommy

Ответы [ 3 ]

7 голосов
/ 16 декабря 2008

Гм, в зависимости от вашего движка базы данных, вы получите разные результаты, но с PostgreSQL я бы сделал что-то вроде этого:

SELECT date_trunc('hour', table.date), count(table.id)
FROM table
GROUP BY date_trunc('hour', table.date)
ORDER BY date_trunc('hour', table.date)

Функция date_trunc усекает поле метки времени до определенной точки. Этот запрос будет показывать вам час за часом количество запросов, вам просто нужно будет внести суммы в ваше программное обеспечение.

Если вы действительно хотите, чтобы SQL-запрос возвращал именно то, что вы хотите, я думаю, вам нужно будет создать функцию, возвращающую набор sql с правильными данными, но я думаю, что это проще сделать в вашем коде.

2 голосов
/ 16 декабря 2008

MySQL имеет множество функций даты / времени ... вы можете искать HOUR (дату) как эквивалент date_trunc ('hour', date) в PostGreSQL.

Итак, если хотите по Дню и Часу ...

SELECT Day(theDate), Hour(theDate), COUNT(1)
FROM theTable
WHERE ....
GROUP BY Day(theDate), Hour(theHour)
ORDER BY Day(theDate), Hour(theHour)

Это даст вам такие строки:

Day,Hour,Count
1,0,102
1,1,133
...
10,22,47
10,23,384
1 голос
/ 03 июля 2009

У меня была похожая ситуация, используя Oracle. С таблицей с именем reports_data я хотел запрос, который мог бы сказать мне, сколько записей было вставлено в час и сколько было вставлено с шагом 10 минут.

В час было легко:

    SELECT TO_CHAR(TRUNC(r.creation_date, 'HH'), 'DD-MON-YYYY HH24:MI:SS'),
         COUNT (*)
    FROM reporting_data r
   WHERE r.creation_date > TO_DATE ('27-OCT-2008', 'dd - mon - yyyy')
     AND r.creation_date < TO_DATE ('28-OCT-2008', 'dd - mon - yyyy')
GROUP BY TO_CHAR (TRUNC (r.creation_date, 'HH'), 'DD-MON-YYYY HH24:MI:SS')
ORDER BY TO_CHAR (TRUNC (r.creation_date, 'HH'), 'DD-MON-YYYY HH24:MI:SS') ASC

Этот запрос будет возвращать подсчет всех записей в период с 27 по 28 октября с разбивкой по часам на основе столбца creation_date .

Разбить его с 10-минутными приращениями вместо часовых приращений было немного сложнее, но с некоторыми манипуляциями это выполнимо.

SELECT   SUBSTR(TO_CHAR(r.creation_date, 'DD-MON-YYYY HH24:MI:SS'), 1, 16) || '0:00',
         COUNT (*)
    FROM reporting_data r
   WHERE r.creation_date > TO_DATE ('27-OCT-2008', 'DD-MON-YYYY')
     AND r.creation_date < TO_DATE ('28-OCT-2008', 'DD-MON-YYYY')
GROUP BY SUBSTR (TO_CHAR (r.creation_date, 'DD-MON-YYYY HH24:MI:SS'), 1, 16) || '0:00'

Там происходит много манипуляций со строками, поэтому это может быть не самый эффективный способ сделать это. Для таблицы, состоящей из более чем 25 000 000 строк, выполнение заняло около минуты. (Опять же, простое выполнение команды SELECT COUNT (*) для той же таблицы также заняло около 30 секунд, поэтому, возможно, были и другие проблемы, помимо запроса.)

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