टेराडाटा में मैं निर्दिष्ट दिनांक सीमा के भीतर चल रहे कुल अवसरों को प्राप्त करने का प्रयास कर रहा हूं। मुझे जो चाहिए वह यह पता लगाना है कि किन ग्राहकों के पास 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) के बीच एक साधारण गणना प्राप्त करने में सक्षम हूं, लेकिन यह पता नहीं लगा सकता कि रनिंग काउंट कैसे प्राप्त करें।
मेरा मानना है कि मुझे असीमित पूर्ववर्ती पंक्तियों का उपयोग करके एक रीसेट फ़ंक्शन की आवश्यकता है, लेकिन इसे काम पर नहीं लाया जा सकता है।
किसी भी सहायता की सराहना की जाएगी।
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 (...)
कर सकते हैं और क्वेरी को ऊपर (...)
.
प्रभावी 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;
संबंधित सवाल
नए सवाल
date
एक तारीख एक विशेष दिन के लिए एक कैलेंडर सिस्टम के भीतर का प्रतिनिधित्व करती है, और इसमें वर्ष, महीना और दिन शामिल होते हैं।