将 Sum(x) Keep( Dense_Rank Last Order by y) 从 oracle 转换为 BigQuery 并在查询中保持分组
Convert Sum(x) Keep( Dense_Rank Last Order by y) from oracle to BigQuery and keep group by in query
我得到如下 oracle 查询。
with table_a as(
select 1 as call_key, date '2021-06-01' as customer_contact, 1 as status from dual union all
select 1 as call_key, date '2021-06-02' as customer_contact, 2 as status from dual union all
select 1 as call_key, date '2021-06-03' as customer_contact, 3 as status from dual union all
select 1 as call_key, date '2021-06-03' as customer_contact, 4 as status from dual union all
select 2 as call_key, date '2021-06-01' as customer_contact, 1 as status from dual union all
select 2 as call_key, date '2021-06-04' as customer_contact, 1 as status from dual
)
select call_key, Sum(status) Keep(Dense_Rank Last Order by customer_contact) as sum_result
from table_a
group by call_key
;
结果是这样的:
| call_key| sum_resul|
| ------|------------|
| 1 | 7 |
| 2 | 1 |
我需要将 Oracle 语言转换为 BigQuery,但 BigQuery 需要在查询中包含 'group by'。
我尝试使用 array_agg 如下所示,但无法获得与 oracle 相同的结果。请帮忙!
with calls as (
select *
from unnest([struct(1 as call_key, date '2021-06-01' as customer_contact, 1 as status)
,struct(1 as call_key, date '2021-06-02' as customer_contact, 2 as status)
,struct(1 as call_key, date '2021-06-03' as customer_contact, 3 as status)
,struct(1 as call_key, date '2021-06-03' as customer_contact, 4 as status)
,struct(2 as call_key, date '2021-06-01' as customer_contact, 1 as status)
,struct(2 as call_key, date '2021-06-04' as customer_contact, 1 as status)
])
)
select call_key
,array_agg(status order by customer_contact,status desc limit 1)[ordinal(1)] as status1
from calls
group by call_key
考虑以下
select call_key, sum(status) sum_result from (
select * from calls where true
qualify 1 = dense_rank() over(partition by call_key order by customer_contact desc)
)
group by call_key
如果应用于您问题中的示例数据 - 输出为
我得到如下 oracle 查询。
with table_a as(
select 1 as call_key, date '2021-06-01' as customer_contact, 1 as status from dual union all
select 1 as call_key, date '2021-06-02' as customer_contact, 2 as status from dual union all
select 1 as call_key, date '2021-06-03' as customer_contact, 3 as status from dual union all
select 1 as call_key, date '2021-06-03' as customer_contact, 4 as status from dual union all
select 2 as call_key, date '2021-06-01' as customer_contact, 1 as status from dual union all
select 2 as call_key, date '2021-06-04' as customer_contact, 1 as status from dual
)
select call_key, Sum(status) Keep(Dense_Rank Last Order by customer_contact) as sum_result
from table_a
group by call_key
;
结果是这样的: | call_key| sum_resul| | ------|------------| | 1 | 7 | | 2 | 1 |
我需要将 Oracle 语言转换为 BigQuery,但 BigQuery 需要在查询中包含 'group by'。
我尝试使用 array_agg 如下所示,但无法获得与 oracle 相同的结果。请帮忙!
with calls as (
select *
from unnest([struct(1 as call_key, date '2021-06-01' as customer_contact, 1 as status)
,struct(1 as call_key, date '2021-06-02' as customer_contact, 2 as status)
,struct(1 as call_key, date '2021-06-03' as customer_contact, 3 as status)
,struct(1 as call_key, date '2021-06-03' as customer_contact, 4 as status)
,struct(2 as call_key, date '2021-06-01' as customer_contact, 1 as status)
,struct(2 as call_key, date '2021-06-04' as customer_contact, 1 as status)
])
)
select call_key
,array_agg(status order by customer_contact,status desc limit 1)[ordinal(1)] as status1
from calls
group by call_key
考虑以下
select call_key, sum(status) sum_result from (
select * from calls where true
qualify 1 = dense_rank() over(partition by call_key order by customer_contact desc)
)
group by call_key
如果应用于您问题中的示例数据 - 输出为