我需要找到一种简单的方法将Biquery中的整数序列转换为空格上带零的矩阵
示例:
v1 v2 v3
5 2 1
需要成为
v1 v2 v3 v4 v5
5 2 1 0 0
0 5 2 1 0
0 0 5 2 1
等
我查看了所有可能的地方,但找不到如何在BQ或SQL中执行此操作。
由于
答案 0 :(得分:2)
我认为下面的解决方案足够通用
#standardSQL
WITH sequence AS (
SELECT ARRAY[5,2,1] AS num
),
numbers AS (
SELECT ARRAY_LENGTH(num) AS len,
ARRAY_CONCAT(num, ARRAY( SELECT 0 FROM sequence, UNNEST(num) AS x)) AS num
FROM sequence
)
SELECT
num[OFFSET(CASE WHEN 1 - n < 0 THEN 2 * len - n ELSE 1 - n END)],
num[OFFSET(CASE WHEN 2 - n < 0 THEN 2 * len - n ELSE 2 - n END)],
num[OFFSET(CASE WHEN 3 - n < 0 THEN 2 * len - n ELSE 3 - n END)],
num[OFFSET(CASE WHEN 4 - n < 0 THEN 2 * len - n ELSE 4 - n END)],
num[OFFSET(CASE WHEN 5 - n < 0 THEN 2 * len - n ELSE 5 - n END)]
FROM numbers, UNNEST(GENERATE_ARRAY(1, len)) AS n
ORDER BY n
您可以轻松地将其调整为任何顺序。为此,您只需要在两个地方进行更改:
调整序列子查询中的ARRAY值(第2行)
在SELECT list
行:
num[OFFSET(CASE WHEN Z - n < 0 THEN 2 * len - n ELSE Z - n END)]
您需要添加为meny,以便行的总数为2xZ-1
,并且每个下一行的Z
增加1
这很容易就是脚本 - 因此将为您生成整个查询(或只是SELECT列表)然后运行
如果你在你选择的客户端(python,go等)中运行它 - 这可能是你的代码的一部分,所以整个东西都是自动化的
答案 1 :(得分:0)
最简单的形式:
select v1, v2, v3, 0 as v4, 0 as v5
from MyTable
where (...)
union all
select 0, v1, v2, v3, 0
from MyTable
where (...)
union all
select 0,0,v1, v2, v3
from MyTable
where (...)
union all
select 0,0,0,v1, v2
from MyTable
where (...)
union all
select 0,0,0, 0,v1
from MyTable
where (...)