sql - 如何忽略 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 |
提前致谢。任何形式的帮助表示赞赏
解决方案
还要考虑以下方法 - 它很容易扩展到任意数量的角色 - 只需将它们添加到相应的列表中:(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'))
如果应用于您问题中的样本数据 - 输出是
推荐阅读
- javascript - 我想用 HTML Get 更改 iframe 源
- python - 要求用户在 python 中使用 for 循环提供数据
- ms-access - 使用 MessageBoxW 模拟 Msgbox 进行 Unicode 显示。输入框需要 unicode
- ios - Apple Watch App 上的“由于执行过程中出现错误而中止命令缓冲区的执行”?
- powershell - 通过“@”提供输入文件会出现错误:喷溅运算符“@”不能用于引用表达式中的变量
- css - 两个具有 flex shrink 和 flex-basis 值的 div 的高度究竟是如何计算的?
- sql - 当与第二个字段相关时,在一个字段中查找完整匹配项
- javascript - JavaScript - 正则表达式检查字符串的大小写字母
- asp.net-core - Postman 中对简单参数的请求不起作用
- visual-studio - Azure Devops - 用户的数据库单元测试登录失败