![](/img/trans.png)
[英]In SQL (Snowflake) how do I attribute earned premium to each month between a start date and an end date?
[英]Snowflake SQL : How do I insert and build in a array : all dates between a specific start and a specific end date
給定每個客戶兩個日期, activation_date
和termination_date
假設在 activation_date 和 termination_date 之間有 20 天。
我如何讓客戶獲得一個以 activation_date 開始並按天持續到 termination_date 的數組?
我嘗試使用:
SELECT
customer_id,
first_day,
last_day,
ARRAY_AGG(TO_DATE(MY_DATE)) WITHIN GROUP (ORDER BY MY_DATE asc)
FROM (
SELECT
customer_id,
activation_day as first_day,
termination_date_clean_formatted as last_day,
TO_DATE(dateadd(day, SEQ4(), first_day)) AS MY_DATE
FROM v
,TABLE(GENERATOR(ROWCOUNT=>(20000)))
WHERE MY_DATE <= last_day
)
group by subscription_id, first_day, last_day
)
select *
from test
但不幸的是,它根本不起作用,結果完全由 customer_id 隨機生成,MY_DATE 甚至不是在與 first_day 相同的日期開始,我每個 customer_id 最多只能得到 8 個結果,這是不可能的。 我例外的結果是:
客戶ID | 大批 |
---|---|
546464654 | [“2022-01-02”、“2022-01-03”……] |
116541165 | [“2022-05-06”,“2022-05-07”……] |
感謝您的幫助:)
您可以使用 JS UDF 生成一個包含日期之間所有日期的數組:
create or replace function gen_dates_array(SINCE date, UNTIL date)
returns variant
language javascript
as $$
dates = [];
currentDate = SINCE;
while (currentDate < UNTIL) {
dates.push(new Date(currentDate));
currentDate.setDate(currentDate.getDate() + 1);
}
dates.push(UNTIL);
return dates.map(x => x.toISOString().split('T')[0]);
$$;
例如:
select gen_dates_array('2020-01-10'::date, '2020-01-13'::date)
-- [ "2020-01-10", "2020-01-11", "2020-01-12", "2020-01-13" ]
另一種僅 SQL 方法使用ARRAY_AGG() 、 DATEDIFF() 、 FLATTEN() 、 REPEAT() :
WITH SOURCE as (
SELECT
DATEADD(day, uniform(1, 365, random(12)), '2020-01-01')::DATE AS start_date
, DATEADD(day, uniform(5,20, random(120)), start_date)::DATE end_date
, DATEDIFF(DAY,START_DATE,END_DATE) CUSTOMER_LENGTH_DAYS
, uniform(1, 10, random(12)) customer_id
FROM TABLE(GENERATOR(rowcount => 10)) v )
SELECT CUSTOMER_ID
,START_DATE
,END_DATE
,ARRAY_AGG( DATEADD(day,INDEX,START_DATE)::DATE) VOILA
FROM SOURCE
,LATERAL FLATTEN(INPUT=>STRTOK_TO_ARRAY(REPEAT('1~',CUSTOMER_LENGTH_DAYS),'~'))
GROUP BY 1,2,3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.