首页 > 解决方案 > 如何忽略 Big Query (BQ) 中列的空值

问题描述

我有一张如下表 -

项目名称 角色1 角色2 角色3
项目1 R11
项目1 R12
项目1 R13
项目1 R21
项目1 R22
项目1 R31
项目2 R14
项目2 R23
项目2 R24
项目2 R25
项目2 R32

还附上了实际桌子的图片

所以,像这样,我有多个项目(230 个项目)和多个角色列(几乎 15 个不同的角色,但这里我只使用了 3 个)& 在每个角色列下存在任意数量的用户(在 1 到 100 之间)

我想首先根据每个项目忽略每一列的这个空值/空白值(最后一个空值应该存在)。(另外,如果 Role1 列有 10 行并且它是 Proj1 的最高行,那么剩余的列也应该有 10 个值,唯一的区别可能是另一列有 3 个实际用户值和 7 个空值,其他列的方式类似)输出应如下所示 -

项目名称 角色1 角色2 角色3
项目1 R11 R21 R31
项目1 R12 R22
项目1 R13
项目2 R14 R23 R32
项目2 R24
项目2 R25

提前致谢。任何形式的帮助表示赞赏

标签: sqlgoogle-bigquerynull

解决方案


还要考虑以下方法 - 它很容易扩展到任意数量的角色 - 只需将它们添加到相应的列表中:(Role1, Role2, Role3)('Role1', 'Role2', 'Role3')

select * except(pos)
from (
  select *, row_number() over(partition by Project_Name, role order by user) pos
  from your_table
  unpivot (user for role in (Role1, Role2, Role3))
)
pivot (any_value(user) for role in ('Role1', 'Role2', 'Role3'))    

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

在此处输入图像描述


推荐阅读