大查询向前填充

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 这样的行将被保留