根据 BigQuery 中嵌套字段的不同值选择行

Posted

技术标签:

【中文标题】根据 BigQuery 中嵌套字段的不同值选择行【英文标题】:Select rows based on distinct values of nested field in BigQuery 【发布时间】:2021-05-02 11:35:38 【问题描述】:

我在 BigQuery 中有一个如下所示的表:

sequence 字段是重复的RECORD。我想每个stepName 选择一行,但是如果每个步骤名称有多行,我想选择sequence.step.elapsedSecondssequence.step.elapsedMinutes 不为空的行,否则选择其中的行这些列是空的。

如上图所示,我想选择行号。 2、4 和 5。我计算出 ROW_NUMBER 是这样的:ROW_NUMBER() OVER(PARTITION BY step.stepName) AS RowNum

这是我目前尝试过滤掉不需要的行的查询:

WITH DistinctRows AS
(
select timestamp, 
  ARRAY (
    SELECT 
      STRUCT(
        STRUCT(
          step.elapsedSeconds, 
          step.elapsedMinutes, 
        ) as step
      ) 
    FROM 
      UNNEST(source_table.sequence) AS sequence
  ) AS sequence, 
  ROW_NUMBER() OVER(PARTITION BY step.stepName) AS RowNum
from source_table,
unnest(sequence) as previousCalls
order by timestamp asc
)

    SELECT *
    FROM DistinctRows,
    unnest(sequence) as sequence
    where (rowNum = 1 and (step.elapsedSeconds is null and step.elapsedMinutes is null)
    or (RowNum > 1 and step.elapsedSeconds is not null and step.elapsedSeconds is not null)
    order by timestamp asc

我需要帮助来弄清楚如何过滤掉像 no 这样的行。 1 和 3,希望能得到一些帮助。

提前致谢。

【问题讨论】:

我很困惑。 是什么样的? stepname 是序列的一部分吗? 另外,你可以有多个不为空的 stepN 吗?你想要所有这些,还是只想要以秒或某事物为单位的最大的? 你能给我们看看原始表吗?您向我们展示了横向连接的结果,我有一种不需要的感觉:) 我已经用@GordonLinoff、@Martin Weitzmann 更新了查询。 stepNamesequence 的子字段,是重复记录。我希望每个 stepName 只显示一行。 【参考方案1】:

嗯。 . .假设stepname 不是重复列的一部分:

SELECT dr.* EXCEPT (sequence),
       (SELECT seq
        FROM unnest(dr.sequence) seq
        ORDER BY seq.step.elapsedSeconds DESC NULLS LAST, 
                 sequence.step.elapsedMinutes DESC NULLS LAST
       ) as sequence
FROM DistinctRows dr
ORDER BY timestamp asc;

如果stepnamesequence 的一部分,则子查询将重新聚合:

SELECT dr.* EXCEPT (sequence),
       (SELECT ARRAY_AGG(sequence ORDER BY stepName)
        FROM (SELECT seq,
                     ROW_NUMBER() OVER (PARTITION BY seq.stepName
                                        ORDER BY seq.step.elapsedSeconds DESC NULLS LAST,  sequence.step.elapsedMinutes DESC NULLS
                                       ) as seqnum
              FROM unnest(dr.sequence) seq
             ) s
        WHERE seqnum = 1
       ) as sequence
FROM DistinctRows dr
ORDER BY timestamp asc

【讨论】:

谢谢你,@Gordon Linoff。 sequence 是重复记录,因此我收到 The argument to ARRAY_AGG must not be an array type but was ARRAY<STRUCT<step STRUCT<elapsedSeconds STRING, elapsedMinutes ARRAY<STRING>>>

以上是关于根据 BigQuery 中嵌套字段的不同值选择行的主要内容,如果未能解决你的问题,请参考以下文章

Google BigQuery 选择记录中所有嵌套字段的总和

Google BigQuery 中的空嵌套字段

BigQuery 从嵌套数组中选择和别名字段而不分组

将 BigQuery 嵌套字段内容展平为新列而不是行

根据来自 2 个不同命中级别数据 Bigquery 的值选择 VISITID

在 Bigquery 中有效地取消嵌套值? (选择/案例/其他?)