टेराडाटा में मैं निर्दिष्ट दिनांक सीमा के भीतर चल रहे कुल अवसरों को प्राप्त करने का प्रयास कर रहा हूं। मुझे जो चाहिए वह यह पता लगाना है कि किन ग्राहकों के पास 10 दिनों के भीतर 5 या अधिक दावे थे।

नमूना डेटा: 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

यहां कोड है जैसा कि मेरे पास अब तक एक एलएजी फ़ंक्शन का उपयोग कर रहा है:

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

मैं न्यूनतम (claim_dt) और अधिकतम (claim_dt) के बीच एक साधारण गणना प्राप्त करने में सक्षम हूं, लेकिन यह पता नहीं लगा सकता कि रनिंग काउंट कैसे प्राप्त करें।

मेरा मानना ​​​​है कि मुझे असीमित पूर्ववर्ती पंक्तियों का उपयोग करके एक रीसेट फ़ंक्शन की आवश्यकता है, लेकिन इसे काम पर नहीं लाया जा सकता है।

किसी भी सहायता की सराहना की जाएगी।

1
S Childs 24 मार्च 2020, 16:31

2 जवाब

अगर आप यह पता लगाना चाहते हैं कि किन ग्राहकों के पास किसी भी 10-दिन की अवधि में 5+ दावे थे, तो यहां एक तरीका दिया गया है:

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 (...) कर सकते हैं और क्वेरी को ऊपर (...).

0
ravioli 24 मार्च 2020, 18:01
ऐसा प्रतीत नहीं होता है कि मुझे वास्तव में क्या चाहिए (हालांकि सराहना की गई)। मुझे दिनांक सीमा के लिए गणना रीसेट करने का एक तरीका चाहिए। हालांकि ऐसा लगता है कि मुझे दावों की गिनती मिल रही है, लेकिन यह मुझे प्रत्येक नई तारीख से रीसेट करने की क्षमता नहीं देता है। मेरा मानना ​​है कि समस्या 10 दिनों की अवधि के बाद रीसेट फ़ंक्शन की आवश्यकता में है।
 – 
S Childs
24 मार्च 2020, 18:26
"दिनांक सीमा के लिए गणना रीसेट करें" से आपका क्या तात्पर्य है? कृपया अपनी मूल पोस्ट में कुछ नमूना अपेक्षित आउटपुट जोड़ें।
 – 
ravioli
24 मार्च 2020, 18:38
मैंने एक अपेक्षित परिणाम जोड़ा। मैं एलएजी फ़ंक्शन का उपयोग करके संभावित गणना पर भी काम कर रहा हूं और अगर मुझे यह काम करने के लिए मिलता है तो मैं साझा करूंगा।
 – 
S Childs
24 मार्च 2020, 19:06

प्रभावी 10 दिन की विंडो (पंक्ति की 10 प्रतियां बनाकर) को कवर करने के लिए पहले प्रत्येक दावा पंक्ति का विस्तार करें और फिर परिणामों को सारांशित और फ़िल्टर करें। बाहरी ग्रुप बाय प्रत्येक min_dt के लिए केवल एक पंक्ति (सबसे बड़ी गिनती/नवीनतम max_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; 
0
Fred 25 मार्च 2020, 01:41
यह भी खूब रही। मुझे लगता है कि मैं अंतराल समारोह और रीसेट के उपयोग के साथ ट्रैक से बाहर था।
 – 
S Childs
25 मार्च 2020, 16:33