Как написать запрос, чтобы получить записи с n последовательных дат - PullRequest
1 голос
/ 24 октября 2019

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

Job Id  Hours   Week Ending Date
1       40      10/25/19
2       40      10/25/19
3       0       10/25/19
1       40      10/18/19
2       40      10/18/19
3       0       10/18/19
1       40      10/21/19
2       40      10/21/19
3       40      10/21/19

Обратите внимание, что для задания с идентификатором 3 у нас есть 2 окончания недели подряд с 0 часами. Мне нужно написать запрос, который возвращает этот идентификатор работы - где есть 2+ недели подряд с 0 часами. Есть идеи, как написать этот запрос?

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

С EXISTS:

select t.* from tablename t
where t.[Hours] = 0
and exists (
  select 1 from tablename
  where [Job Id] = t.[Job Id] and [Hours] = 0 
  and abs(datediff(day, [WeekEndingDate], t.[WeekEndingDate])) = 7
)

См. Демоверсию . Результаты:

> Job Id | Hours | WeekEndingDate     
> -----: | ----: | :----------
>      3 |     0 | 25/10/2019 
>      3 |     0 | 18/10/2019 
0 голосов
/ 24 октября 2019

Это даст вам одну запись за каждый период, когда отработано 0 часов.

select
    a.[job id]
,   max(a.number_of_weeks) as number_of_weeks
from (
    select
        [job id]
    ,   [hours]
    ,   [Week Ending Date]
    ,   sum([hours]) over (partition by [job id], [hours] order by [job id], [Week Ending Date] desc ) as hour_count
    ,   row_number() over (partition by [job id], [hours] order by [job id], [Week Ending Date] desc ) as number_of_weeks
    from jobs
    ) as a
where a.hour_count = 0
group by a.[job id]
having MAX(a.number_of_weeks) > 1
0 голосов
/ 24 октября 2019

Вы можете использовать lag() или lead():

select distinct job_id
from (select t.*,
             lead(hours) over (partition by job_id order by week_ending_date) as next_hours
      from t
     ) t
where hours = 0 and next_hours = 0;

Выше формально ответ на ваш вопрос о получении таких идентификаторов работы. Вы также можете выбрать информацию о том, какие недели также.

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