Google bigquery 尝试将多列中的单元格拆分为行-取消最新查询

Google bigquery 尝试将多列中的单元格拆分为行-取消最新查询,google-bigquery,bigquery-standard-sql,Google Bigquery,Bigquery Standard Sql,大家好 我在网站上找到了解决类似问题的方法,只使用了一列,这帮助我完成了一半,但当我需要取消阵列测试时,我被困在了最后一部分 以下是到目前为止的查询: #StandardSQL With Data AS ( SELECT 'aaa' as Item, 'EA/BX/PA' as UOM, '1/10/100' as Factor UNION ALL SELECT 'bbb' as Item, 'EA/PA' as UOM, '1/50' as Factor UNION ALL SELECT 'c

大家好

我在网站上找到了解决类似问题的方法,只使用了一列,这帮助我完成了一半,但当我需要取消阵列测试时,我被困在了最后一部分

以下是到目前为止的查询:

#StandardSQL
With Data AS
(
SELECT 'aaa' as Item, 'EA/BX/PA' as UOM, '1/10/100' as Factor UNION ALL
SELECT 'bbb' as Item, 'EA/PA' as UOM, '1/50' as Factor UNION ALL
SELECT 'ccc' as Item, null as UOM, null as Factor 
),
SplitData AS
(
SELECT
Item,
SPLIT(UOM, "/") as UOM,
SPLIT(Factor, "/") as Factor
FROM Data
)
SELECT
*
FROM
SplitData,
UNNEST(SplitData.UOM),UNNEST(SplitData.Factor)
结果是:

--Row---+--Item---+--UOM--¦--Factor--+--f0_--+--f1_--
   1    ¦  aaa    ¦  EA   ¦    1     ¦  EA   ¦  1
        ¦         ¦  BX   ¦   10     ¦       ¦
        ¦         ¦  PA   ¦  100     ¦       ¦
--------+---------+-------+----------+-------+-------    
   2    ¦  aaa    ¦  EA   ¦    1     ¦  EA   ¦  10
        ¦         ¦  BX   ¦   10     ¦       ¦
        ¦         ¦  PA   ¦  100     ¦       ¦
--------+---------+-------+----------+-------+-------
等等等等

我想看到的是:

--Row---+--Item---+--UOM--¦--Factor--+
   1    ¦  aaa    ¦  EA   ¦    1     ¦
--------+---------+-------+----------+
   2    ¦  aaa    ¦  BX   ¦   10     ¦
--------+---------+-------+----------+
   3    ¦  aaa    ¦  PA   ¦  100     ¦
--------+---------+-------+----------+
   4    ¦  bbb    ¦  EA   ¦    1     ¦ 
--------+---------+-------+----------+
等等等等

我发现问题出在我的查询中是双重的unnest,它试图将每一个与每一个连接起来,但是当我只选择ItemCode时,我根本没有得到UOM和Factors

你知道我需要如何修改查询才能得到这个结果吗?

试试这个:

With

Data AS (
    SELECT 'aaa' as Item, 'EA/BX/PA' as UOM, '1/10/100' as Factor UNION ALL
    SELECT 'bbb' as Item, 'EA/PA' as UOM, '1/50' as Factor UNION ALL
    SELECT 'ccc' as Item, null as UOM, null as Factor 
),

SplitData AS (
    SELECT
        Item,
        SPLIT(UOM, "/") as UOM,
        SPLIT(Factor, "/") as Factor
    FROM
        Data
)

SELECT
    *,
    Factor[offset(uom_offset)] as unnested_factor
FROM
    SplitData as sd
    cross join UNNEST(sd.UOM) as unnested_uom  -- use left join if you want to display 'ccc' Item
        with offset as uom_offset
还有一点:

With

Data AS (
    SELECT 'aaa' as Item, 'EA/BX/PA' as UOM, '1/10/100' as Factor UNION ALL
    SELECT 'bbb' as Item, 'EA/PA' as UOM, '1/50' as Factor UNION ALL
    SELECT 'ccc' as Item, null as UOM, null as Factor
),

SplitData AS (
    SELECT
        Item,
        SPLIT(UOM, "/") as UOM,
        SPLIT(Factor, "/") as Factor
    FROM Data
)

SELECT
    sd.*,
    unnested_uom,
    unnested_factor
FROM
    SplitData as sd
    left join UNNEST(sd.UOM) as unnested_uom
        with offset as uom_offset
    left join UNNEST(sd.Factor) as unnested_factor
        with offset as factor_offset
where
    coalesce(uom_offset, factor_offset, 1)
    = coalesce(factor_offset, uom_offset, 1)
试试这个:

With

Data AS (
    SELECT 'aaa' as Item, 'EA/BX/PA' as UOM, '1/10/100' as Factor UNION ALL
    SELECT 'bbb' as Item, 'EA/PA' as UOM, '1/50' as Factor UNION ALL
    SELECT 'ccc' as Item, null as UOM, null as Factor 
),

SplitData AS (
    SELECT
        Item,
        SPLIT(UOM, "/") as UOM,
        SPLIT(Factor, "/") as Factor
    FROM
        Data
)

SELECT
    *,
    Factor[offset(uom_offset)] as unnested_factor
FROM
    SplitData as sd
    cross join UNNEST(sd.UOM) as unnested_uom  -- use left join if you want to display 'ccc' Item
        with offset as uom_offset
还有一点:

With

Data AS (
    SELECT 'aaa' as Item, 'EA/BX/PA' as UOM, '1/10/100' as Factor UNION ALL
    SELECT 'bbb' as Item, 'EA/PA' as UOM, '1/50' as Factor UNION ALL
    SELECT 'ccc' as Item, null as UOM, null as Factor
),

SplitData AS (
    SELECT
        Item,
        SPLIT(UOM, "/") as UOM,
        SPLIT(Factor, "/") as Factor
    FROM Data
)

SELECT
    sd.*,
    unnested_uom,
    unnested_factor
FROM
    SplitData as sd
    left join UNNEST(sd.UOM) as unnested_uom
        with offset as uom_offset
    left join UNNEST(sd.Factor) as unnested_factor
        with offset as factor_offset
where
    coalesce(uom_offset, factor_offset, 1)
    = coalesce(factor_offset, uom_offset, 1)

下面是BigQuery标准SQL,并基于示例数据假设以UOM和Factor表示的元素数相同

#standardSQL
SELECT item, u AS UOM, f AS Factor
FROM `project.dataset.data`
LEFT JOIN UNNEST(SPLIT(UOM, '/')) u WITH OFFSET
JOIN UNNEST(SPLIT(Factor, '/')) f WITH OFFSET
USING(OFFSET)
如果要应用于您问题中的样本数据-结果为

Row item    UOM     Factor   
1   aaa     EA      1    
2   aaa     BX      10   
3   aaa     PA      100  
4   bbb     EA      1    
5   bbb     PA      50   

下面是BigQuery标准SQL,并基于示例数据假设以UOM和Factor表示的元素数相同

#standardSQL
SELECT item, u AS UOM, f AS Factor
FROM `project.dataset.data`
LEFT JOIN UNNEST(SPLIT(UOM, '/')) u WITH OFFSET
JOIN UNNEST(SPLIT(Factor, '/')) f WITH OFFSET
USING(OFFSET)
如果要应用于您问题中的样本数据-结果为

Row item    UOM     Factor   
1   aaa     EA      1    
2   aaa     BX      10   
3   aaa     PA      100  
4   bbb     EA      1    
5   bbb     PA      50   

嗨,好的。谢谢你来试一试。不幸的是,第二个例子给出了与我发布的结果相同的结果,第一个例子也给出了相同的结果,仅使用偏移量编号替换计量单位,但仍保持嵌套格式:这应该是正确的解决方案-尝试使用ItemThank you@MartinWeitzmann替换sd.*在第二个示例中,从sd中排除计量单位和系数的做法非常有魅力!是的,您将继续使用未列出的数组,这将重复该数组中每个条目包含相同数组的父行。你看到了这些重复的数组。。。现在把他们排除在外嗨,好的,谢谢你尝试一下。不幸的是,第二个例子给出了与我发布的结果相同的结果,第一个例子也给出了相同的结果,仅使用偏移量编号替换计量单位,但仍保持嵌套格式:这应该是正确的解决方案-尝试使用ItemThank you@MartinWeitzmann替换sd.*在第二个示例中,从sd中排除计量单位和系数的做法非常有魅力!是的,您将继续使用未列出的数组,这将重复该数组中每个条目包含相同数组的父行。你看到了这些重复的数组。。。现在,这确实是一种非常优雅的方式,谢谢!不幸的是,它忽略了ccc项,我在结果查询中仍然需要它。但是,一个小的修改修复了以下问题:选择项,未列出的.u作为计量单位,未列出的.f作为系数从数据左连接选择*从数据左连接未列出的拆分计量单位,“/”u与偏移量连接未列出的拆分系数,“/”f与偏移量使用偏移量使用未列出的使用项抱歉,这不是我从你们的例子中理解需求的方式,我想看到的是:部分。所以在这种情况下-将JOIN unnestsplifactor,'/'f与OFFSET一起更改为LEFT JOIN unnestsplifactor,'/'f与OFFSET一起,简单,最优雅的女神!太好了,谢谢。两个答案都给出了正确的结果,但你的答案肯定更优雅,更容易阅读。这肯定是一种非常优雅的方式,谢谢!不幸的是,它忽略了ccc项,我在结果查询中仍然需要它。但是,一个小的修改修复了以下问题:选择项,未列出的.u作为计量单位,未列出的.f作为系数从数据左连接选择*从数据左连接未列出的拆分计量单位,“/”u与偏移量连接未列出的拆分系数,“/”f与偏移量使用偏移量使用未列出的使用项抱歉,这不是我从你们的例子中理解需求的方式,我想看到的是:部分。所以在这种情况下-将JOIN unnestsplifactor,'/'f与OFFSET一起更改为LEFT JOIN unnestsplifactor,'/'f与OFFSET一起,简单,最优雅的女神!太好了,谢谢。两个答案都给出了正确的结果,但你的答案肯定更优雅,更容易阅读。