Счетчик хода в диапазоне дат

В Teradata я пытаюсь получить промежуточное количество вхождений в указанном диапазоне дат. Мне нужно выяснить, у каких клиентов было 5 или более претензий в течение 10 дней.

Пример данных: Claim_ID Claim_Dt Cust_num

15087   1/1/2020    123000
15099   2/3/2020    123000
18473   2/8/2020    123000
18476   2/8/2020    123000
18488   2/10/2020   123000
15080   1/1/2020    133000
15082   1/1/2020    133000
18555   2/13/2020   133000
18588   2/15/2020   133000
15601   2/16/2020   133000
15711   2/18/2020   133000
15799   2/21/2020   133000
15816   2/22/2020   133000
15926   2/27/2020   133000
15988   3/1/2020    133000

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

Cust_num   Claim_Count   Min_date   Max Date
133000           6        2/13/2020   2/22/2020

Вот код, который у меня есть, используя функцию LAG:

select  CLAIM_DT, CUST_NUM,      
ROW_NUMBER() OVER (PARTITION BY CUST_NUM ORDER BY CUST_NUM, CLAIM_DT) as     ROW_ID,

LAG(claim_dt,1) OVER(partition by cust_num order by claim_dt) as datediff,
claim_dt -datediff as DAYS_BETWEEN,
COUNT(claim_id) OVER(
PARTITION BY Cust_Num 
ORDER BY claim_dt
RESET WHEN DAYS_BETWEEN > 10
ROWS BETWEEN 5 PRECEDING AND 5 FOLLOWING 
  ) AS Claims_count, CLAIM_ID
from       (       
select  CLAIM_ID, CLAIM_DT, CUST_NUM
from    Claims_CUST_STILL_OPEN 

   ) as dt 

QUALIFY Claims_count >= 5
order by 2,1,3

Я могу получить простой счетчик между min (demand_dt) и max (demand_dt), но не могу понять, как получить текущий счет.

Я считаю, что мне нужна функция RESET, использующая строки UNBOUNDED PRECEDING, но я просто не могу заставить ее работать.

Любая помощь будет оценена.

Всего 2 ответа


Если вы хотите узнать, у каких клиентов было более 5 претензий за любой 10-дневный период, вот один из способов:

SELECT 
  Cust_Num, 
  COUNT(t.claim_id) OVER(
    PARTITION BY t.Cust_Num 
    ORDER BY c.calendar_date
    ROWS BETWEEN 4 PRECEDING AND 5 FOLLOWING -- count # claims in 10-day window
  ) AS moving_count
FROM sys_calendar.calendar c -- Seed result set with range of days
LEFT JOIN my_table t ON c.calendar_date = t.claim_dt -- Join customer data
WHERE c.calendar_date BETWEEN <start_date> AND <end_date>
QUALIFY moving_count >= 5 -- Only get rows with 5+ claims

Вероятно, вы не можете включить DISTINCT в основной запрос, поэтому чтобы получить уникальный список значений cust_num , вы можете выполнить внешнее SELECT DISTINCT cust_num FROM (...) и поместить запрос выше внутри (...) .


Сначала разверните каждую строку заявки, чтобы охватить эффективное 10-дневное окно (создав 10 копий строки), а затем суммируйте и отфильтруйте результаты. Внешний GROUP BY должен дать только одну строку (с наибольшим числом / последним max_dt) для каждого min_dt.

select cust_id, max(claim_ct) as claim_ct, min_dt, max(max_dt) as max_ct
FROM (
  select cust_id, count(*) as claim_ct, min(claim_dt) as min_dt, max(claim_dt) as max_dt
  FROM (
     select claim_id, claim_dt, cust_id, begin(window_pd) as window_dt
     from claims
     expand on period(claim_dt, claim_dt+10) as window_pd 
       ) expand_effective_date_range
  group by cust_id, window_dt /* running total by customer & day */ 
  having window_dt = max_dt /* only keep rows with matching claim dates */
  and Claim_ct >=5 /* and then only if count is at least 5 */
     ) summarize_and_filter
group by cust_id, min_dt; 

Есть идеи?

10000