将 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             

如果应用于您问题中的示例数据 - 输出为