簡體   English   中英

Snowflake SQL:如何插入和構建數組:特定開始日期和特定結束日期之間的所有日期

[英]Snowflake SQL : How do I insert and build in a array : all dates between a specific start and a specific end date

給定每個客戶兩個日期, activation_datetermination_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM