SQL Запрос на получение отдельных дат с разницей не менее 10 дней - PullRequest
0 голосов
/ 18 июня 2020

У меня есть таблица, состоящая из дат и имен. Я хочу сгруппировать результат по именам и датам с условием, что выбранные результирующие даты разнесены не менее чем на 10 дней. (начиная с первой даты, представленной в таблице для этого имени)

Это пример:

________________________
Names    |      Dates    
-----------------------
John     |      2-2-2000
________________________
John     |      5-2-2000
________________________
John     |      16-2-2000
________________________
John     |      17-2-2000
________________________
John     |      20-2-2000
________________________
John     |      31-2-2000
________________________
John     |      5-3-2000
________________________
John     |      14-3-2000
________________________

Результатом запроса должна быть сумма количества этих значений (John, 2-2-2000), (Иоанн, 16-2-2000), (Иоанн, 31-2-2000), (Иоанн, 14-3-2000) То есть 4.

Как мне написать запрос в SQL Сервер для этого?

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Ваш вопрос непонятен. Также с вашими желаемыми результатами согласуется то, что вы хотите подсчитать строки, в которых разрыв от предыдущей строки составляет 10+ дней. Для этого просто используйте lag():

select count(*)
from (select t.*,
             lag(date) over (partition by name) as prev_date
      from t
     ) t
where prev_date is null or prev_date < dateadd(day, -10, date);

Используйте select *, чтобы получить список записей.

0 голосов
/ 18 июня 2020

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

with 
    data as (
        select t.*, row_number() over(partition by names order by dates) rn
        from mytable t
    ),
    rcte as (
        select d.*, dates dates_base from data d where rn = 1
        union all
        select 
            d.*, 
            case when d.dates >= dateadd(day, 10, r.dates_base) then d.dates else r.dates_base end
        from rcte r
        inner join data d on d.rn = r.rn + 1 and d.names = r.names  
    )
select names, count(distinct dates_base) res from rcte group by names

Демо в DB Fiddlde :

names | res
:---- | --:
John  |   4
...