Нахождение количества уникальных значений текущего месяца, отсутствующего в последние 4 месяца - PullRequest
0 голосов
/ 19 марта 2020

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

select month(dd/mm/yyyy), (count(distinct ID) - sum(l)) 
from
(select x.ID, x.dd/mm/yyyy, y.ID as ID2, y.dd/mm/yyyy as Date2, (case when x.ID = y.ID then 1 else 0 end as l) from table1 x
left join table1 y 
on y.dd/mm/yyyy between dateadd(month,-4, x.dd/mm/yyyy) and dateadd(month,-1, x.dd/mm/yyyy))
group by month(dd/mm/yyyy) 
order by month(dd/mm/yyyy);

   (dd/mm/yyyy) ID  
    01/01/2018  A  
    01/02/2018  B  
    02/02/2018  C  
    01/03/2018  A    
    02/03/2018  D  
    01/04/2018  D  
    02/04/2018  E        
    01/05/2018  E         
    02/05/2018  A    
    01/05/2018  F        
    01/05/2018  G    

Ожидаемый результат -

Month Count
1      1    --(A)
2      2    --(B,C)
3      1    --(D)
4      1    --(E)
5      2    --(F,G)

1 Ответ

0 голосов
/ 19 марта 2020

Вы можете агрегировать по месяцам, а затем использовать lag(), чтобы увидеть, где находится предыдущее значение:

select yyyymm,
       sum(case when prev_yyyymm is null or
                     prev_yyyymm < dateadd(month, -3, yyyymm)
                then 1 else 0
           end) as cnt
from (select t.id, v.yyyymm,
             count(*) as cnt,  -- not needed but perhaps fun to have
             lag(v.yyyymm) over (partition by t.id order by v.yyyymm) as prev_yyyymm
      from t cross apply
           (values (datefromparts(year(date_filled), month(date_filled), 1)
           ) v(yyyymm)
     ) t
group by yyyymm
order by yyyymm;
...