arrays - BigQuery 参数最大值 : Is array order maintained when doing CROSS JOIN UNNEST

标签 arrays google-bigquery cross-join argmax

问题:

在 BigQuery 中,标准 SQL,如果我运行

SELECT *
FROM mytable
CROSS JOIN UNNEST(mytable.array)

我可以确定生成的行顺序与数组顺序相同吗?

示例:

假设我有下表mytable:

Row | id   | prediction
1   | abcd | [0.2, 0.5, 0.3]

如果我运行 SELECT * FROM mytable CROSS JOIN UNNEST(mytable.prediction),我可以确定行顺序与数组顺序相同吗? IE。结果表是否总是:

Row | id   | unnested_prediction
1   | abcd | 0.2
2   | abcd | 0.5
3   | abcd | 0.3

更多用例背景(argmax):

我正在尝试在每行 (argmax) 中查找数组中具有最大值的数组索引,即上面数组中的第二个元素 (0.5)。因此,我的目标输出是这样的:

Row | id   | argmax
1   | abcd | 2

使用 CROSS JOIN、一个由 prediction 值排序的 DENSE_RANK 窗口函数和一个 ROW_NUMBER 窗口函数来找到 argmax,我可以使用一些测试数据来完成这项工作。您可以使用此查询进行验证:

WITH predictions AS (
  SELECT 'abcd' AS id, [0.2, 0.5, 0.3] AS prediction
  UNION ALL
  SELECT 'efgh' AS id, [0.7, 0.2, 0.1] AS prediction
),
ranked_predictions AS (
  SELECT 
    id,
    ROW_NUMBER() OVER (PARTITION BY id) AS rownum, -- This is the ordering I'm curious about
    DENSE_RANK() OVER (PARTITION BY id ORDER BY flattened_prediction DESC) AS array_rank
  FROM
     predictions P
  CROSS JOIN
    UNNEST(P.prediction) AS flattened_prediction
)
SELECT
  id,
  rownum AS argmax
FROM
  ranked_predictions
WHERE array_rank = 1

ROW_NUMBER 在我的测试中表现良好(即它根据未嵌套数组排序)可能只是巧合,所以很高兴能确定。

最佳答案

Can I be certain that the resulting row order is the same as the array order?

您应该使用 WITH OFFSET 来获取数组中元素的位置,这样您就可以使用它们在您的进一步逻辑中进行排序

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'abcd' id, [0.2, 0.5, 0.3] prediction
)
SELECT id, unnested_prediction
FROM `project.dataset.table`, 
UNNEST(prediction) unnested_prediction WITH OFFSET pos
ORDER BY id, pos  

关于arrays - BigQuery 参数最大值 : Is array order maintained when doing CROSS JOIN UNNEST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53635020/

相关文章:

c - 在没有 [] 和 () 运算符的情况下在 C 中打印出一个数组 - 怎么做?

c++ - 使用 strrev 在 C++ 中正确反转字符串

javascript - 使用 Underscore.js 将数组转换为对象数组?

sql - bigquery按除几列外的所有列分组

python - 尝试使用 Python 查询 Google BigQuery 时出现错误 "Login Required"

mysql - 获取按时间间隔按月分组的累计和

sql - 使用 2 个 ORDER BY 语句的 COUNT 中没有零值

c++ - 按字母顺序排列名称

google-bigquery - 为什么这 2 个查询具有相同的 "GB processed"(因此成本)?

r - Data.table 中的交叉联接似乎不保留列名