2015-11-07 6 views
2

У меня есть таблица SQL Server 2008, где у меня есть список сотрудников с timestamps.SQL Как сгруппировать по, но со специальными условиями

У меня есть сценарий, который группирует сотрудников по датам.

Что мне нужно, это группировать работником, но я должен исключить отметки времени, которые находятся в тот же день, а разница между ними - менее 8 часов.

Ниже приведена таблица, которая объясняет лучше:

enter image description here

Я создал SQL скрипку с таблицей и выборки данных.

http://sqlfiddle.com/#!3/3b956/1

Любой ключ?

+0

Вашего примера больше похоже на 'порядка by' чем' группы by'. –

ответ

2

Что вы действительно хотите, это lag(), который находится в SQL Server 2012+. С lag(), вы могли бы сделать:

select t.* 
from (select t.*, lag(date) over (partition by EmployeeId order by date) as prev_date 
     from t 
    ) t 
where not (cast(prev_date as date) = cast(date as date) and 
      date <= dateadd(hour, 8, prev_date) 
     ) or 
     prev_date is null; 

В SQL Server 2008, вы можете сделать что-то подобное с outer apply:

select t.* 
from t outer apply 
    (select top 1 prev.* 
     from t prev 
     where prev.Employee_id = t.EmployeeId and 
      prev.date < t.date and 
      cast(prev.date as date) = cast(t.date as date) 
     order by prev.date desc 
    ) prev 
where prev.date is null or 
     t.date > dateadd(hour, 8, prev.date); 

Вам может понадобиться order by поддерживать тот же порядок.

+0

Я получаю NULL, используя первый скрипт. – VAAA

+0

И нет «порядка» внутри запроса «top 1». Я знаю, что это был несчастный случай. – shawnt00

+0

@ VAAA. , , Первый не должен работать, потому что 'lag()' не поддерживается в SQL Server 2008. Я исправил второй с помощью 'order by'. –

0

Это также должно работать, за исключением строк, для которых существует previuos ряда с разностным менее чем за 8 часов:

select p1.employeeid, count(*) as [count] 
from punch p1 
where not exists(select * from punch p2 
       where p2.employeeid = p1.employeeid and p2.id < p1.id and 
       dateadd(hour, 8, p2.date) > p1.date) 
group by p1.employeeid 
Смежные вопросы