GROUP BY по нескольким дням. Как?

WoLFiks

Не курю...
Есть таблица 2 поля:
date (формат: дата, без времени), fn
Как сделать группировку за каждые N дней? Например за 3?
Если группировать за день, то легко:
SELECT date, COUNT(*) FROM table GROUP BY date
Получим вывод например:
2016-11-18 = 3 записей
2016-11-17 = 15 записей
2016-11-16 = 20 записей
2016-11-15 = 25 записей
2016-11-14 = 7 записей
...
Как состряпать такой итог:
2016-11-18 - 2016-11-16 = 38 записей
2016-11-15 - 2016-11-13 = 32 записи
...

Спасибо!
 

antson

Новичок
Партнер клуба
@WoLFiks, соорудить функцию которая будет считать номер интервала.
для N=7 это номер недели в году.
а так округление(номер_дня_в_году()/N) - интервалы будут выравнены на начало года . накладка с интервалами на границе года.

если нужно M интервалов и точный подсчет назад от текущей даты то можно генерировать такую часть запроса
case when data>='начало' and data<='конец' then 1 when data>='начало2' and data<='конец2' then 2 ....... endcase

Но мое мнение правильнее пойти таким путем
Код:
select period.s, period.e, (select count() from t where data between period.s and period.e) as cnt from
(
 select '2016-11-20' as s , '2016-11-17' as e
 union  select '2016-11-16','2016-11-13'
 ...............
)period
подзапрос период можно и другими способами сделать

кол-во считать не подзапросом а объединять с основной таблицей.
в общем вариантов много , нужно пробывать и выбирать оптимальный
скорость / понятность
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Любопытных результатов можно достичь, комбинируя "номер недели" и дни недели. (Что, как я понимаю, ближе к реальной задаче, чем абстрактные и никому не нужные "каждые три дня".)
 

WoLFiks

Не курю...
Любопытных результатов можно достичь, комбинируя "номер недели" и дни недели. (Что, как я понимаю, ближе к реальной задаче, чем абстрактные и никому не нужные "каждые три дня".)
Ну а мне как раз нужны конкретные и очень нужные каждые 3 дня.
Группировка за каждые 3 дня за год. И не важно выходной, праздник или прочее.
 

WoLFiks

Не курю...
И в чём проблема? Запрос элементарный:
PHP:
select year(date) _year, ceiling(dayofyear(date)/3) _days3, count(*) _count
from table
group by _year, _days3
Группировка: год, 3_дня (начиная 01.01 каждого года).
Да, спасибо, примерно к этому и пришел ) ..
Сейчас осталось поправить, чтобы не от 0101, а от сегодняшнего было.
 

WoLFiks

Не курю...
Блин, точно!
PHP:
ceiling((to_days(now()) - to_days(date))/3)
Спасибо!
Как можно было не сообразить отнимать я ХЗ )))
 
Сверху