【问题标题】:Using multiple nested fields in BigQuery在 BigQuery 中使用多个嵌套字段
【发布时间】:2012-12-19 11:42:02
【问题描述】:

我有一些包含商店信息的记录。这些记录有几个不同的嵌套字段。嵌套字段之一是标签,一个是员工。我正在尝试计算具有标签和具有特定名称的员工的商店数量。所以我这样做了:

SELECT count(*)
FROM [stores.stores_844_1]
where tags.tag_name='foo'
and employees.first_name='bar'

然后我得到错误:

Error: Cannot query the cross product of repeated fields tags.tag_name and employees.first_name.

我可以通过将查询更改为:

SELECT count(*)
FROM ((flatten([stores.stores_844_1],tags))
where tags.tag_name='foo'
and employees.first_name='bar'

问题在于我正在动态创建 where 子句,因此我的 from 子句必须根据我在 where 中的内容进行更改。虽然我可以在代码中生成一些逻辑来确定 from 子句应该是什么,但我想知道是否有办法执行以下操作:

SELECT count(*)
FROM [stores.stores_844_1]
where tags.tag_name='foo' WITHIN RECORD
and employees.first_name='bar' WITHIN RECORD

这样就不用把主表弄平了? 我尝试过像这样使用丑陋的解决方法:

SELECT count(*)
FROM
(SELECT GROUP_CONCAT(CONCAT('>', tags.tag_name,'<')) WITHIN RECORD as f1, GROUP_CONCAT(CONCAT('>',employees.first_name,'<')) WITHIN RECORD as f2
FROM [stores.stores_844_1]
)
where f1 CONTAINS '>foo<'
and f2 CONTAINS '>bar<'

这个丑陋的解决方法可以按我的意愿工作,但它看起来真的很丑陋,必须有更好的方法,对吧?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    您可以使用WITHIN RECORD 提出另一个字段来指示值是否存在。我不确定这是否符合您的要求,因为您仍然需要更改 FROM 子句,但它似乎比您目前所做的更干净。换句话说,试试这个:

    SELECT count(*) FROM (
        SELECT SUM(IF(tags.tag_name='foo', 1, 0)) WITHIN RECORD as has_foo,
               SUM(IF(employees.first_name='bar', 1, 0)) WITHIN RECORD as has_bar,
        FROM  [stores.stores_844_1])
        WHERE has_foo > 0 AND has_bar > 0
    

    【讨论】:

    • 不幸的是,当我尝试这样做时,我得到了错误:Unknown field: has_foo 如果我将它移到外部 where 子句,它会起作用。我认为使用 SUM 肯定比使用 group_concat 更有效,所以我将改用它。理想情况下,有一种方法可以做到这一点,因此只有子选择的 WHERE 子句受到影响,而您不必对 SELECT 子句做任何事情。
    • 我已经更新了我的回复,将括号移到 where 子句中。我不确定有没有办法在不修改外部 where 子句(不添加另一个嵌套选择)的情况下做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多