Группировка по дате, интервалу дня в запросе SQL

Скажем, у меня есть таблица, похожая на следующую (упрощенную):

| Name  | Date     | Hours |
| Bob   | 10/1/13  |  5    |
| John  | 10/1/13  |  8    |
| Bob   | 10/2/13  |  6    |
| Ashley| 10/2/13  |  4    |
...
| Bob   | 10/17/13 |  4    |
| John  | 10/17/13 |  6    |
| John  | 10/18/13 |  3    |
...

Учитывая начальную дату (скажем, 10.10.13), как я могу построить запрос к группе Name, SUM(Hours) по 14-дневным интервалам? Так что результат будет примерно таким:

| Name  | Period              | SUM(Hours) |
| Bob   | 10/1/13 - 10/14/13  |  11        |
| John  | 10/1/13 - 10/14/13  |  8         |
| Ashley| 10/1/13 - 10/14/13  |  4         |
| Bob   | 10/15/13 - 10/29/13 |  4         |
| John  | 10/15/13 - 10/29/13 |  9         |

Я пробовал предложения, перечисленные в сообщениях, такие как: Группировать по диапазону дат по неделям / месяцам, но они обычно предполагают, что вы хотите фактические недели. Поскольку это всего лишь 14-дневные интервалы, они не обязательно совпадают с неделями года.

Любое предложение или руководство приветствуется!

Редактировать: это запрос к серверу NexusDB, поэтому он использует стандарт SQL:2003.

1 ответ

Решение

Может быть что-то подобное может сработать? (Предполагая, что это MySQL)

ОБНОВЛЕНИЕ: проверено в SQL Fiddle (спасибо @ pm-77-1): http://sqlfiddle.com/

Слово предостережения: из-за того, что мы здесь делаем арифметику дат, этот запрос может стать тяжелым, если он будет выполняться на большой таблице.

SELECT Name, 
CONCAT(DATE_ADD(<your-starting-date>, INTERVAL period*14 day),
" - ",
DATE_ADD(<your-starting-date>, INTERVAL period*14+13 day)) as Period,
Hours FROM 
(SELECT Name, 
FLOOR(DATEDIFF(Date,<your-starting-date>)/14) AS period, 
SUM(Hours) as Hours 
FROM <yourtable> GROUP BY period, name) p;

ОБНОВЛЕНИЕ для NexusDB. Я нашел некоторую информацию для замены DateDiff в NexusDB:

http://www.nexusdb.com/support/index.php?q=node/10091

Принимая это во внимание, у вас есть два варианта: либо добавить эту функцию в вашу БД, затем вам не нужно изменять запрос, либо заменить DATEDIFF этим определением:

SELECT Name, 
CONCAT(DATE_ADD(<your-starting-date>, INTERVAL period*14 day),
" - ",
DATE_ADD(<your-starting-date>, INTERVAL period*14+13 day)) as Period,
Hours FROM 
(SELECT Name, 
FLOOR(cast((cast(Date as float ) - cast(<your-starting-date> as float)) as integer)/14) as period,
SUM(Hours) as Hours 
FROM <yourtable> GROUP BY period, name) p;
Другие вопросы по тегам