使用array_agg和struct后如何在列中查找值?

Posted

技术标签:

【中文标题】使用array_agg和struct后如何在列中查找值?【英文标题】:How to find a value in a column after I've used array_agg and struct? 【发布时间】:2021-09-02 18:30:37 【问题描述】:

在我的数据库中使用以下代码后,我得到了以下结果:

select USERID, 
  array_agg(struct(ORDER_TIME, DELIVERY_TIME, PLATFORM) order by ORDER_TIME) STATS
from `project.dataset.table`
group by USERID 
having count(1) > 1
order by USERID
USERID STATS.ORDER_TIME STATS.DELIVERY_TIME STATS.PLATFORM
011 2021-01-09 11:14:18 2021-01-09 11:44:01 mobile
2021-02-12 16:15:51 2021-02-12 17:16:51 desktop
2021-03-30 17:23:45 2021-02-12 17:16:51 desktop
033 2021-01-01 12:30:14 2021-01-01 13:30:00 mobile
2021-04-16 23:00:45 2021-04-16 23:45:40 mobile
040 2021-02-18 19:22:55 2021-02-18 20:00:05 mobile
2021-05-06 09:12:13 2021-05-06 10:00:10 ​ desktop

但是,我只需要那些同时包含移动和桌面的寄存器。所以我需要这样的结果,其中没有 USERID 040 的数据,因为他们只在手机上订购:

USERID STATS.ORDER_TIME STATS.DELIVERY_TIME STATS.PLATFORM
011 2021-01-09 11:14:18 2021-01-09 11:44:01 mobile
2021-02-12 16:15:51 2021-02-12 17:16:51 desktop
2021-03-30 17:23:45 2021-02-12 17:16:51 desktop
033 2021-01-01 12:30:14 2021-01-01 13:30:00 mobile
2021-05-06 09:12:13 2021-05-06 10:00:10 ​ desktop

我怎么可能做到这一点?非常感谢!

【问题讨论】:

【参考方案1】:

“最简单”的方法是在having 子句中添加更多条件

select USERID, array_agg(struct(ORDER_TIME, DELIVERY_TIME, PLATFORM) order by ORDER_TIME) STATS
from `project.dataset.table`
group by USERID 
having count(1) > 1
and 'mobile' in unnest(array_agg(PLATFORM))
and 'desktop' in unnest(array_agg(PLATFORM))
order by USERID     

如果应用于您问题中的样本数据 - 输出是

如果您有更多此类条目要比较 - 您可以使用以下版本以避免重复类似的代码行

select USERID, array_agg(struct(ORDER_TIME, DELIVERY_TIME, PLATFORM) order by ORDER_TIME) STATS
from `project.dataset.table`
group by USERID 
having count(1) > 1
and array_length(array_agg(distinct if(PLATFORM in ('mobile', 'desktop'), PLATFORM, null))) = 2
order by USERID 

【讨论】:

以上是关于使用array_agg和struct后如何在列中查找值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python在列中插入日期

使用 One Hot 编码后在列中显示特征名称

PySpark:如何在列中使用 Or 进行分组

Python QTableView:如何在列中插入项目

UltraWebGrid:如何在列中使用下拉列表

如何使用 Spark 数据框中的 lit 在列中插入值?