BigQuery 的 MySQL 条件组

Posted

技术标签:

【中文标题】BigQuery 的 MySQL 条件组【英文标题】:MySQL Conditional Group By BigQuery 【发布时间】:2018-11-29 16:40:56 【问题描述】:

我有下表。我想聚合几列和GROUP BYstore。问题是如果upc 是负数并且有相应的正数upc 我希望它始终选择正数。如果没有对应的正面upc,那么保持负面就可以了。此外,当我尝试在 Google BigQuery 上运行类似的查询时(据我了解,它使用 mysql) 并从GROUP BY 中省略upc 我收到错误“SELECT list expression references column upc which is not grouped or aggregated”。知道为什么 BigQuery 的行为与 MySQL 工作台不同,以及如何强制查询始终采用积极的upc

谢谢

CREATE TABLE upc (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
store  VARCHAR(30) NOT NULL,
amount DOUBLE,
total INT,
upc INT
);

INSERT INTO upc (store, amount, total, upc) VALUES
    ('123', 12.3, 1, 123),
    ('123', 45.6, 2, -666),
    ('789', 78.9, 3, 789),
    ('789', 78.9, 3, 789),
    ('456', 78.9, 3, -456),
    ('456', 78.9, 3, -456),
    ('123', 78.9, 3, 123);

SELECT store, SUM(amount), SUM(total), upc FROM upc 
GROUP BY store;

【问题讨论】:

如果store 有多个正的upc 值;你想选择其中任何一个? 肯定不会超过一个upc 如果有多个负值怎么办?你在乎选哪一个吗?如果不是,Elliott 的解决方案应该足够了,您应该考虑将其标记为已接受的答案。 是的,负值无关紧要。事实上,我确实选择了 Elliot 的解决方案 【参考方案1】:

BigQuery 不使用 MySQL。如果您想要upc 的正值,则计算列的MAX

SELECT store, SUM(amount), SUM(total), MAX(upc)
FROM upc 
GROUP BY store;

【讨论】:

【参考方案2】:

另一个变化是使用 ANY_VALUE() 而不是 MAX() 来消除计算 MAX 函数,这会产生额外的成本 - 这适用于非常大容量的数据。在小数据上,这甚至可能不可见

#standardSQL
SELECT store, SUM(amount), SUM(total), ANY_VALUE(upc)
FROM `project.dataset.upc`
GROUP BY store  

【讨论】:

以上是关于BigQuery 的 MySQL 条件组的主要内容,如果未能解决你的问题,请参考以下文章

将 MySQL 查询转换为 BigQuery 查询

BigQuery 隐藏 UDF 实现

BigQuery:无效日期错误

如何加入 Firebase 和 BigQuery

查询结果后 BigQuery 导出多个文件

BigQuery - 在插入表时调用查询