【问题标题】:How do I check if an specific element inside my SQL array is followed by another one?如何检查我的 SQL 数组中的特定元素是否跟在另一个元素之后?
【发布时间】:2021-07-02 01:16:53
【问题描述】:

所以,我有一个看起来像这样的分组表:

ID event date1 date2
001 click 2021-01-05 2021-01-06
impression 2021-01-05 2021-01-06
click 2021-04-03 2021-04-04
click 2021-05-07 2021-05-08
090 impression 2021-02-02 2021-02-03
impression 2021-06-04 2021-06-05
033 click 2021-03-15 2021-04-16
impression 2021-03-15 2021-04-16
064 impression 2021-05-17 2021-05-18
click 2021-06-19 2021-06-20

我只需要在同一天以这个确切的顺序获取第一次点击和广告(事件列上的点击值)和看到和广告(事件列上的印象值)的用户的 ID。 date1 是我们必须查看事件是否发生在同一天的地方。最终的结果是这样的:

ID event date1 date2
001 click 2021-01-05 2021-01-06
impression 2021-01-05 2021-01-06
033 click 2021-03-15 2021-04-16
impression 2021-03-15 2021-04-16

我尝试了几种方法,但都没有奏效。这就是我要问的只能使用 sql 来完成吗?

谢谢!

【问题讨论】:

    标签: sql arrays google-bigquery


    【解决方案1】:

    考虑以下解决方案

    select id, array_agg(event_rec) data
    from `project.dataset.table`, unnest(data) event_rec
    where event_rec.event in ('click', 'impression')
    group by id, date1
    having count(distinct event) = 2 
    

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

    【讨论】:

    • 你好,米哈伊尔!由于某种原因,查询不起作用,我收到以下错误:无法识别的名称:[6:10] 的事件。我很确定它由于混叠而无法正常工作(混叠在 BQ 中从未对我有用)。有没有其他办法?
    • 请说明您的表格架构。是 eventdate1date2 单独的重复列或者它们是相同重复列的结构(后者是我对答案的假设)
    • 这是架构:imgur.com/a/PUwsJak(不是英文的,但我相信你会明白的)。
    • 哦,好的。所以只需将events 替换为data!我只是在我的回答中做到了。如果仍然有问题,请尝试让我知道 :o)
    • 它有效,但只有当我删除“有计数(不同事件)=2”时。如果我不删除拥有,我会得到“这个查询没有返回结果”
    【解决方案2】:

    您可以取消嵌套和重新聚合。 . .我在想:

    select t.*,
           (select [event, next_event]
            from (select event,
                         lead(event) over (partition by date1 order by n) as next_event,
                         n
                  from unnest(t.events) event with offset n
                 ) e
            where next_event.event = 'impression' and
                  event.event = 'click'
            qualify row_number() over (order by n) = 1
           ) as events
    from t;
    

    编辑:

    如果您专门寻找数组的前两个元素,那么这很简单:

    select t.*,
           [event[safe_ordinal(1)].event, event[safe_ordinal(2)].event]
    from t
    where event[safe_ordinal(1)].event = 'click' and
          event[safe_ordinal(2)].event = 'impression';
    

    【讨论】:

    • 当我运行您的查询时,这里出现错误: from unnest(t.events) event with offset n 为了获得分组事件,我使用了: ARRAY_AGG(STRUCT(events, date1, date2, ORDER BY date1 ASC) AS data 所以我的列是 data.events、data.date1 和 data.date2。抱歉没有提到。那样我不知道如何使用它,因为既不是“data.events”也不是“事件”有效。
    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2019-02-12
    相关资源
    最近更新 更多