2016-02-02 15 views
0

Everyday работник болен, запись добавляется
Моя таблица выглядит следующим образом (пример):Группировка дат для каждого периода

Name - Date 
Ben - 14/01/2016 
Ben - 15/01/2016 
Ben - 18/01/2016 
Ben - 19/01/2016 
Ben - 02/02/2016 
Ben - 03/02/2016 
Bart - 12/01/2016 
Bart - 13/01/2016 
Bart - 14/01/2016 
Lisa - 26/02/2016 
Lisa - 29/02/2016 
Lisa - 01/03/2016 

Что мне нужно:

Name - StartDate - NumberOfDays 
Ben - 14/01/2016 - 4 (so 4 following dates (including a weekend)) 
Ben - 02/02/2016 - 2 
Bart - 12/01/2016 - 3 
Lisa - 26/02/2016 - 3 

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

Я не знаю, как начать и даже если это возможно в SQL.

Проблема заключается в том, что период может включать в выходные дни, так что я думаю, что нужны таблицы даты в выходные дни и праздники проверить (потому что просто принимая ==>(difference current.date-previous.date) <= 3 будет возможно сделать один период фактического два периода, когда 3 дни не выходные)?

Надеюсь, я хорошо объяснил свою проблему. Вся помощь очень ценится!

+6

MySQL и SQL Server имеют разную обработку даты и времени. Не помещайте продукты, которые не задействованы ... – jarlh

+1

Как насчет национальных праздников? – jarlh

+0

Если у вас есть таблица времени, добавьте в нее еще один столбец, который будет оценивать каждую строку и фильтровать выходные дни, так что столбец ранга будет постоянно – sagi

ответ

-4

Это для SQL Server:

select Name, min(Date), count(*), Year(Date), Month(Date) 
from table 
group by Name, Year(Date), Month(Date) 

Другие базы данных будут иметь эквивалентные функции YEAR() и Month().

+0

Это не то, о чем спросите. Вы принесете только одну строку для Ben – Horaciux

+0

Я думаю, что это то, что спросил OP. Это будет один ряд в год/месяц для Бена. –

+0

op ask for continuos days – Horaciux

0

MS Access? Я сомневаюсь, что это можно легко решить с помощью MS Access SQL самостоятельно, но я не знаю, что это достаточно хорошо, чтобы быть уверенным.

Что вы будете делать, это перекрестное присоединение ко всем больным пользователям со всеми нерабочими днями. Используйте этот результат в союзе с больными днями. Тогда все это становится просто пробелом и проблемой острова. Обычно лучше всего решаются с помощью аналитических функций, и я уверен, что MS Access не работает.

Это будет работать баз:

select s.name, n.date, 'NO WORK DAY' 
from (select distinct name from sick) s 
cross join noneworkdays n 
union all 
select s.name, s.date, 'SICK' 
from sick s; 

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

Смежные вопросы