首页 > 解决方案 > 使用基于另一个列 ID 的值填充部分空列

问题描述

我不确定我的标题是否清楚。对于那个很抱歉。我有下表:

ID           ref.    dummy_metrics dummy_dimensions
6091039909   A       123           foo
5914111836   B       456           bar
6538463041   C       789           foobar
6018474808   D       1010          bar
6091039909                         foo
6091039909                         foo
6538463041                         foobar
6538463041                         foobar
6538463041                         foobar

如您所见,我的桌子的某些部分是空的。我想确保该ref.列总是充满了一些东西。我希望这个值基于ID<>ref.密钥对组合。

所以这是我的预期输出:

ID           ref.    dummy_metrics dummy_dimensions
6091039909   A       123           foo
5914111836   B       456           bar
6538463041   C       789           foobar
6018474808   D       1010          bar
6091039909   A                     foo
6091039909   A                     foo
6538463041   C                     foobar
6538463041   C                     foobar
6538463041   C                     foobar

我不想像使用CASE公式那样构建预定义的查找表。我想要ID<>ref.在我的表中找到的每个密钥对组合都具有动态性。

标签: sqlgoogle-bigquery

解决方案


这是一个非常简单的方法:

select t.*,
       coalesce(t.ref,
                max(t.ref) over (partition by dummy_dimensions),
                max(t.ref) over ()
               ) as imputed_ref

这使用窗口函数来填充缺失值。请注意,有两个级别的插补——一个基于dummy_dimensions整个表,另一个基于整个表(如果维度ref值都是NULL)。


推荐阅读