【发布时间】:2021-12-22 11:44:11
【问题描述】:
我写了以下查询。加入 f7 和 f8 是因为有时上一季度/年度的收入为 NULL,但仅适用于那一天。如果 15 天前的收入是正数,那么我们知道它仍然是一个活动帐户,而 NULL 是由于合同暂时失效。
无论如何,我正在尝试更新这一点,以便每天获得上一季度/年度之前的最后一个实际收入值,而不是上一季度和年度之前的 15 天。我不确定这是否可行,因为每个帐户的加入日期不同。所以也许需要另一种方法。任何帮助将不胜感激。
如果我已经充分解释了这一点,请告诉我。
with
arr_base as (select * from arr_base_table opp)
,cte_accounts as (select distinct account_id,
account_name
,account_owner_name
,account_region_c
,account_theater_c
,owner_theater_c
,customer_first_purchase_date
,cohort_date
from arr_base)
,cte_account_product_info as (select account_id
,account_name
,activity_date
,line_item_count
,has_casb_count
,has_casb_api_count
,has_casb_inline_count
,has_swg_count
,has_ng_swg_count
,has_swg_all_count
,has_npa_count
,has_iaas_count
,has_dlp_count
,has_dlp_adv_count
,has_dlp_std_count
,has_firewall_count
,has_cspm_count
,has_email_count
,has_rbi_count
,has_support_count
,npa_user_count
,is_casb_customer
,is_swg_customer
,is_npa_customer
,is_firewall_customer
,number_of_products
,customer_has_two_or_more_products
from arr_base)
,cte_dates as (select distinct activity_date from arr_base)
,cte_arr as (select account_id
,account_name
,activity_date
,arr
,casb_api_arr
,casb_inline_arr
,casb_combined_arr
,swg_arr
,ng_swg_packages_arr
,swg_combined_arr
,cspm_arr
,firewall_arr
,iaas_storage_scan_arr
,npa_arr
,email_arr
,rbi_arr
,dlp_arr
,dlp_std_arr
,dlp_adv_arr
,support_arr
from arr_base)
-- cartesian product
select
dim.activity_date
,dateadd(year,-1,dim.activity_date) as prev_year_date
,add_months(dim.activity_date, -3) as prev_quar_date
,dim.account_id
,dim.account_name
,dim.account_owner_name
,dim.account_region_c
,dim.account_theater_c
,dim.owner_theater_c
,dim.customer_first_purchase_date
,dim.cohort_date
,f4.line_item_count
,f5.line_item_count as line_item_count_prev_year
,f6.line_item_count as line_item_count_prev_quarter
,f1.arr as arr_current_year
,f2.arr as arr_prev_year
,f3.arr as arr_prev_quarter
,f7.arr as arr_prev_year_plus15
,f8.arr as arr_prev_quarter_plus15
from
(
select
a.*
,d.activity_date
from cte_accounts a cross join cte_dates d
) as dim
left outer join cte_arr f1 on dim.account_id = f1.account_id and dim.activity_date = f1.activity_date
left outer join cte_arr f2 on dim.account_id = f2.account_id and (dateadd(year,-1,dim.activity_date) = f2.activity_date)
left outer join cte_arr f3 on dim.account_id = f3.account_id and (add_months(dim.activity_date, -3) = f3.activity_date)
left outer join cte_account_product_info f4 on dim.account_id = f4.account_id and dim.activity_date = f4.activity_date
left outer join cte_account_product_info f5 on dim.account_id = f5.account_id and (dateadd(year,-1,dim.activity_date) = f5.activity_date)
left outer join cte_account_product_info f6 on dim.account_id = f6.account_id and (add_months(dim.activity_date, -3) = f6.activity_date)
left outer join cte_arr f7 on dim.account_id = f7.account_id and (dateadd(day,15,(dateadd(year,-1,dim.activity_date))) = f7.activity_date)
left outer join cte_arr f8 on dim.account_id = f8.account_id and (dateadd(day,15,(add_months(dim.activity_date, -3))) = f8.activity_date)
order by
dim.activity_date
,dim.account_id
添加当前结果和所需结果。仅包括样本数据中的相关列。对于账户 2,arr_prev_year 为 NULL,因为该账户在 2020 年 1 月没有收到任何收入。 arr_prev_year_plus15 也是 NULL,因为整个 1 月份都没有收到任何收入。
在预期结果中,在 2020 年 1 月 31 日之前,账户 2 最近收到的收入是在 2019 年 12 月 31 日。因此,在该日期,相应的收入会在 prev_year_most_recent_date 和 arr_prev_year_most_recent 列中返回。
当前结果
| Activity_date | Prev_year_date | Prev_quar_date | prev_year_plus15_date | prev_quar_plus15_date | account_id | arr_current_year | arr_prev_year | arr_prev_quarter | arr_prev_year_plus15 | arr_prev_quarter_plus15 |
|---|---|---|---|---|---|---|---|---|---|---|
| Jan. 31, 2021 | Jan. 31, 2020 | Oct. 31, 2020 | Jan. 16, 2020 | Oct. 16, 2020 | 1 | 100 | 90 | 95 | 90 | 95 |
| Jan. 31, 2021 | Jan. 31, 2020 | Oct. 31, 2020 | Jan. 16, 2020 | Oct. 16, 2020 | 2 | 100 | NULL | 80 | NULL | 80 |
期望的结果:
| Activity_date | Prev_year_date | Prev_quar_date | prev_year_most_recent_active_date | prev_quarter_most_recent_active_date | account_id | arr_current_year | arr_prev_year | arr_prev_quarter | arr_prev_year_most_recent | arr_prev_quarter_most_recent |
|---|---|---|---|---|---|---|---|---|---|---|
| Jan. 31, 2021 | Jan. 31, 2020 | Oct. 31, 2020 | Jan. 30, 2020 | Oct. 30, 2020 | 1 | 100 | 90 | 95 | 90 | 95 |
| Jan. 31, 2021 | Jan. 31, 2020 | Oct. 31, 2020 | Dec. 31, 2019 | Oct. 30, 2020 | 2 | 100 | NULL | 80 | 75 | 80 |
【问题讨论】:
-
嗨迈克尔,在这种情况下,示例数据和预期结果将为您提供更好的答案。仅通过不执行此操作的查询很难说出您需要什么。如果您需要归结为获取给定属性的先前非空值,则可以在子查询中创建空指示符。然后对您的 account_id、null_indicator 进行 LAG() 分区。不过,这只是在黑暗中拍摄,因为我不完全确定您要实现的目标。
-
很公平。让我更新示例数据和所需结果
-
另外,请尝试提供一个最小的、可重现的示例。我猜该 SQL 的很大一部分与您的问题无关,例如您列出的大部分列
-
是的,你是对的。将来,我将确保尽可能简化我的示例,同时仍能理解要点。感谢您的反馈。
标签: sql snowflake-cloud-data-platform