将 MySQL 查询转换为 BigQuery 查询
Posted
技术标签:
【中文标题】将 MySQL 查询转换为 BigQuery 查询【英文标题】:Translate MySQL query to BigQuery query 【发布时间】:2017-02-01 13:28:59 【问题描述】:我无法将 mysql 查询转换为 Google Bigquery 查询。这是我的 MySQL 查询
SELECT id
FROM office_details
GROUP BY address
HAVING max(value)
ORDER BY id
此查询在 phpMyAdmin 和我的 php 脚本上完美运行。但是当我将其转换为 bigquery 时
SELECT id
FROM Office_db.office_details
GROUP BY address
HAVING max(value)
ORDER BY id
它说列 id
既不在 group by 也不聚合。
我需要的是唯一address
的id
s,其中value
是最大值。例如
+-------------------------+
| id | address | value |
+-------------------------+
| 1 | a | 4 |
| 2 | a | 3 |
| 3 | b | 2 |
| 4 | b | 2 |
+-------------------------+
我需要
+----+
| id |
+----+
| 1 |
| 3 |
+----+
【问题讨论】:
原来的查询是无意义的,所以不知道你想让我们做什么。 一个表中有多个相同地址的条目。我只想获取一个地址的id
,对于这些address
条目,value
是最大的地址
【参考方案1】:
#standardSQL
SELECT id FROM (
SELECT
id, address,
ROW_NUMBER() OVER(PARTITION BY address ORDER BY value DESC, id) AS flag
FROM office_details
)
WHERE flag = 1
【讨论】:
@Strawberry - 不知道你的意思。正如问题所问 - 我的答案是 BigQuery Standard SQL 噢!我需要更多的咖啡! @MikhailBerlyant 非常感谢。【参考方案2】:试试这个:
#standardSQL
SELECT ARRAY_AGG(id ORDER BY value DESC, id LIMIT 1)[OFFSET(0)] AS id
FROM office_details
GROUP BY address;
与使用RANK
的解决方案相比,它更不容易耗尽内存(并且可能更快),因为它不需要在分区内计算排名时缓冲所有行。作为一个工作示例:
#standardSQL
WITH office_details AS (
SELECT 1 AS id, 'a' AS address, 4 AS value UNION ALL
SELECT 2, 'a', 3 UNION ALL
SELECT 3, 'b', 2 UNION ALL
SELECT 4, 'b', 2
)
SELECT
address,
ARRAY_AGG(id ORDER BY value DESC, id LIMIT 1)[OFFSET(0)] AS id
FROM office_details
GROUP BY address
ORDER BY address;
这给出了结果:
address | id
------------
a | 1
b | 3
【讨论】:
【参考方案3】:一个有效的查询可能如下所示:
SELECT MIN(x.id) id
FROM office_details x
JOIN
( SELECT address
, MAX(value) value
FROM officer_details
GROUP
BY address
) y
ON y.address = x.address
AND y.value = x.value
GROUP
BY address
, value
【讨论】:
通过这个查询,我可能会得到超过 1 个相同地址的 id。因为表中的值和地址可能都相同 @SSMA 修改您的问题以反映此新信息 - 以及您希望在这种情况下返回的结果。 @SSMA 同样。以上是关于将 MySQL 查询转换为 BigQuery 查询的主要内容,如果未能解决你的问题,请参考以下文章
如何将我的 Bigquery 查询转换为 AWS Athena 查询?
如何将 BigQuery SQL 查询结果转换为 Spark DataFrame?