根据 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.elapsedSeconds
和sequence.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 更新了查询。 stepName
是sequence
的子字段,是重复记录。我希望每个 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;
如果stepname
是sequence
的一部分,则子查询将重新聚合:
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 选择记录中所有嵌套字段的总和