【发布时间】:2017-01-01 11:08:37
【问题描述】:
我在 BigQuery 中有一个表,其中包含一个 ID 字段和一个重复记录字段以及其他一些字段,例如数据收集时间。
每个 ID 在此表中有多行,我想以某种方式为每个 ID 选择/合并一行。在我的用例中,几乎所有解决方案(例如选择最后一个、选择第一个和在一行中聚合具有重复 ID 的行)都是可以接受的,但到目前为止我无法让它们中的任何一个工作。
更准确地说,我的表有一个 ID 字段,在 BigQuery 术语中是:
{name: ID, type: STRING, mode: NULLABLE} 和重复字段:{name: data, type: RECORD, mode: REPEATED} 以及其他一些(普通)字段。
在我的表中,每个 ID 都有多行,每个 ID 都有一个重复字段 data 。在我的查询结果中,我想要一个具有完全相同架构的表,其中每个 ID 只出现一次,并且其对应的 data 字段是来自原始表中出现的 ID 之一的 data 字段。 (或理想情况下的所有事件的联合)
这里列出了在这里不起作用的解决方案:
首先:使用
row_number() OVER (PARTITION BY ID ORDER BY collection_time) as rn ... where rn=1
原因:BigQuery 在使用 partition by 时会展平结果,即使使用了 Unflatten Results 选项也是如此。
第二:选择具有最大/最小收集时间值的行:
因为:由于系统其他部分的一些重复,对于我的表中的每个 id,列的值不是唯一的。
第三:在其他字段上使用group by ID 和nest/first。
原因: 在重复记录上使用nest 会破坏记录字段中的关系。例如SELECT ID, nest(data.a), nest(data.b)来自:
ID data.a data.b
--------------------------
1 1a1 null
1a2 1b2
--------------------------
1 2a1 2b1
null 2b2
结果
ID data.a data.b
----------------------------
1 1a1 1b2
1a2 2b1
2a1 2b2
【问题讨论】:
-
所以你有不同的行有相同的ID,每一行都有重复的字段,你想把重复的结构合并成一个结构吗?
-
@Pentium10 是的,但我在“合并”方面很灵活,因此每个 ID 只选择一行也是可以接受的。
-
让我们定义基数,因为它令人困惑,所以行意味着插入时的整行,例如定义
ID的行。然后repeated record表示重复,所以它大于 1。合并后您希望纯记录仅 1 个条目,还是希望在合并后保留所有条目? -
@Pentium10 我在问题中添加了一段,希望我能够清楚地描述问题。
-
在您想要的结果中 - 您不匹配 data.a 和 data.b 以致不再保留初始的 a/b 对。有预期的逻辑吗?所以 a 和 b 之间没有硬性关系?
标签: sql google-bigquery