大查询向前填充
Big Query Fill Forward
我的 BQ 中有简单的数据 table:
Row make model cost color
1 hhkb hybrid 300 cream dark
2 durgod K320 120 grey cream
3 durgod hades 130 white black
4 rf pf2 300 white black
5 drop alt 200 white black silver bronze
6 idobao id67 200 white black silver rust
我想要做的是在空格上拆分颜色列并将数据呈现为非规范化;包含每种颜色选项的所有详细信息的一行。所以它看起来像这样:
Row make model cost color
1 hhkb hybrid 300 cream
2 hhkb dark
3 durgod K320 120 grey
4 durgod cream
5 durgod hades 130 white
6 durgod black
7 rf pf2 300 white
8 rf black
9 drop alt 200 white
10 drop black
11 drop silver
12 drop bronze
13 idobao id67 200 white
14 idobao black
15 idobao silver
16 idobao rust
我很欣赏无论对一个列有效的技术,可以说 'make' 也可以对其他列重复,这就是为什么在上面的示例中我只询问如何前向填充 'make' 在 'color' 列上的 SPLIT 之后。
我目前拥有的是:
SELECT
make,
model,
cost,
SPLIT(color, ' ') color,
LAST_VALUE(make IGNORE NULLS) OVER (PARTITION BY color ORDER BY model ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS maker,
FROM
`learnsql-xxxxxx.sampledata.keyboards`
LIMIT
1000
但这只会导致输出如下:
这让我觉得我拆分颜色列的方式一定有问题,因为它不会产生新行。
如果有人能在正确的方向上推动我,我将不胜感激!不用说我是 SQL.
的新手
更新
经过大量实验,我想到了这个:
WITH keybs AS (
SELECT
make AS make,
model AS model,
cost AS cost,
SPLIT(color, ' ') color
FROM
`learnsql-xxxxxx.sampledata.keyboards`
)
SELECT
keybs.make,
keybs.model,
keybs.cost,
color
FROM keybs
CROSS JOIN UNNEST(keybs.color) AS color
LIMIT
1000
这给出了所需的输出。这是最好的方法吗?
考虑以下方法
select t.* except(color), color
from `learnsql-xxxxxx.sampledata.keyboards` t
left join unnest(split(color, ' ')) color
除了 [显着] 不那么冗长之外 - 它使用 left join
而不是 cross join
。原因是 - 如果某些行没有颜色(空值) - cross join
这样的行将从输出中排除,而 left join
这样的行将被保留
我的 BQ 中有简单的数据 table:
Row make model cost color
1 hhkb hybrid 300 cream dark
2 durgod K320 120 grey cream
3 durgod hades 130 white black
4 rf pf2 300 white black
5 drop alt 200 white black silver bronze
6 idobao id67 200 white black silver rust
我想要做的是在空格上拆分颜色列并将数据呈现为非规范化;包含每种颜色选项的所有详细信息的一行。所以它看起来像这样:
Row make model cost color
1 hhkb hybrid 300 cream
2 hhkb dark
3 durgod K320 120 grey
4 durgod cream
5 durgod hades 130 white
6 durgod black
7 rf pf2 300 white
8 rf black
9 drop alt 200 white
10 drop black
11 drop silver
12 drop bronze
13 idobao id67 200 white
14 idobao black
15 idobao silver
16 idobao rust
我很欣赏无论对一个列有效的技术,可以说 'make' 也可以对其他列重复,这就是为什么在上面的示例中我只询问如何前向填充 'make' 在 'color' 列上的 SPLIT 之后。
我目前拥有的是:
SELECT
make,
model,
cost,
SPLIT(color, ' ') color,
LAST_VALUE(make IGNORE NULLS) OVER (PARTITION BY color ORDER BY model ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS maker,
FROM
`learnsql-xxxxxx.sampledata.keyboards`
LIMIT
1000
但这只会导致输出如下:
这让我觉得我拆分颜色列的方式一定有问题,因为它不会产生新行。
如果有人能在正确的方向上推动我,我将不胜感激!不用说我是 SQL.
的新手更新
经过大量实验,我想到了这个:
WITH keybs AS (
SELECT
make AS make,
model AS model,
cost AS cost,
SPLIT(color, ' ') color
FROM
`learnsql-xxxxxx.sampledata.keyboards`
)
SELECT
keybs.make,
keybs.model,
keybs.cost,
color
FROM keybs
CROSS JOIN UNNEST(keybs.color) AS color
LIMIT
1000
这给出了所需的输出。这是最好的方法吗?
考虑以下方法
select t.* except(color), color
from `learnsql-xxxxxx.sampledata.keyboards` t
left join unnest(split(color, ' ')) color
除了 [显着] 不那么冗长之外 - 它使用 left join
而不是 cross join
。原因是 - 如果某些行没有颜色(空值) - cross join
这样的行将从输出中排除,而 left join
这样的行将被保留