Группировка по X дням - PullRequest
       16

Группировка по X дням

1 голос
/ 24 июля 2010

У меня есть база данных, которая показывает мне различные статистические данные о разных кампаниях, каждая строка имеет имя временной отметки с именем «дата».

Я написал код для выбора и суммирования диапазона дат, например: 21-24 / 07/2010. Теперь мне нужно добавить опцию, чтобы выбрать диапазон дат, а также сгруппировать статистику для каждого X дней.

Допустим, пользователь выбирает статистику за весь месяц: 01 / 07-31 / 07. Я хотел бы представить ему статистику, сгруппированную по X дням, скажем, 3, чтобы он увидел статистику 01-03 / 07, 04-06 / 07,07-09 / 07 и так далее ...

Мне почти удалось сделать это с помощью этого кода:

SELECT t1.camp_id,from_days( floor( to_days( date ) /3 ) *3 ) AS 'first_date'
FROM facebook_stats t1
INNER JOIN facebook_to_campaigns t2 ON t1.camp_id = t2.facebook_camp_id
WHERE date
BETWEEN 20100717000000
AND 20100724235959
GROUP BY from_days( floor( to_days( date ) /3 ) *3 ) , t2.camp_id

Он действительно группирует его (по 3 дням), но проблема в том, что по какой-то причине он начинается с 16/07, а не 17/07, а затем группируется каждый раз по 3 дня.

Хотелось бы услышать решение кода или я дал, или лучшее решение, которое вы имеете в виду.

1 Ответ

0 голосов
/ 24 июля 2010

To_Days возвращает количество дней с года 0. Когда вы делите его на 3, он учитывает только частное, а не остаток.например.Если с года 0 прошло 5 дней, то to_days вернет 1.

To_days (20100717000000) должны оставить остаток от 1. В основном To_days (2010071 6 000000) делится точнона 3, а 17-е нет.

Вы можете попробовать этот запрос:

DECLARE @startDate datetime
DECLARE @endDate datetime
DECLARE @groupByInterval INT
SET @startdate = 20100717000000
SET @enddate = 20100724235959
SET @groupByInterval = 3

SELECT 
t1.camp_id,   from_days(
to_days(@startDate)+floor(
(to_days(date)-to_days(@startDate))/@groupByInterval
)
* @groupByInterval) 
AS first_date
FROM facebook_stats t1
INNER JOIN facebook_to_campaigns t2 ON t1.camp_id = t2.facebook_camp_id
WHERE date
BETWEEN @startDate
AND @endDate
GROUP BY first_date , t2.camp_id
...