【问题标题】:Legacy UDF - Determine largest value in a dictionary/mapLegacy UDF - 确定字典/地图中的最大值
【发布时间】:2019-04-02 16:59:48
【问题描述】:

我有一个 JSON 映射/字典,我想在其中找到最大值,但我在编写 UDF 时遇到了问题(使用旧版 SQL 语法)。我在网上找不到很多资源或示例,但我确实看到了很多标准 SQL。任何人都可以提供使用旧版 SQL 处理地图、字典和用户定义函数的帮助或在线示例吗?谢谢!

示例输入: {“cat_age”: 14, “dog_age”: 4} (这是我表中的一列,我们将列名称为“AgeColumn”)

输出: 14

【问题讨论】:

  • 至少提供输入数据和预期输出的示例!
  • 我会更新的!很抱歉@MikhailBerlyant
  • 您希望每行的最大值还是整列的最大值?
  • @MikhailBerlyant 每行!
  • 抱歉一直问 - 为什么要遗留?为什么不标准?

标签: javascript sql database google-bigquery legacy-sql


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT col, 
  (
    SELECT AS STRUCT CAST(SPLIT(item, ':')[SAFE_OFFSET(1)] AS INT64) age, item 
    FROM UNNEST(SPLIT(REGEXP_REPLACE(col, r'{|}', ''))) item
    ORDER BY CAST(SPLIT(item, ':')[SAFE_OFFSET(1)] AS INT64) DESC
    LIMIT 1
  ).*
FROM `project.dataset.table`   

您可以使用虚拟数据进行测试,如以下示例所示进行上述操作

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '{“cat_age”: 14, “dog_age”: 4}' col UNION ALL
  SELECT '{“cat_age”: 11, “dog_age”: 16}' 
)
SELECT col, 
  (
    SELECT AS STRUCT CAST(SPLIT(item, ':')[SAFE_OFFSET(1)] AS INT64) age, item 
    FROM UNNEST(SPLIT(REGEXP_REPLACE(col, r'{|}', ''))) item
    ORDER BY CAST(SPLIT(item, ':')[SAFE_OFFSET(1)] AS INT64) DESC
    LIMIT 1
  ).*
FROM `project.dataset.table`   

结果

Row     col                                 age     item     
1       {“cat_age”: 14, “dog_age”: 4}       14      “cat_age”: 14    
2       {“cat_age”: 11, “dog_age”: 16}      16      “dog_age”: 16    

【讨论】:

  • 谢谢@Mikhail!我会搞砸这个并花更多时间更好地理解它。
  • P.S.不,这与 UDF 无关,因为我在这里看不到使用它的任何原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-19
  • 2023-01-28
  • 2023-03-29
  • 2015-07-17
  • 2023-03-29
  • 2015-07-20
  • 2013-08-09
相关资源
最近更新 更多