【问题标题】:Translate MySQL query to BigQuery query将 MySQL 查询转换为 BigQuery 查询
【发布时间】: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 是最大的地址

标签: mysql google-bigquery


【解决方案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 同样。
    猜你喜欢
    • 2019-07-29
    • 2018-11-01
    • 2013-07-10
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多