将 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 也不聚合。

我需要的是唯一addressids,其中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 相关子查询 - 将数组转换为数组

如何将 BigQuery SQL 查询结果转换为 Spark DataFrame?

将 Cloud Storage 文件转换为 BigQuery 表/数据集以供稍后查询

如何将JSON字符串列行转换为可查询表

通过 google BigQuery 将 unsigned int 转换为 signed int