【问题标题】:Is there a way to use window funtions over a specific column value instead of a row vlaue有没有办法在特定列值而不是行值上使用窗口函数
【发布时间】:2023-02-09 17:07:26
【问题描述】:

我在 BigQuery 中有以下模式显示人口数量及其各自的国家:

country       STRING  
country_code  STRING
year_1960     INT
year_1961     INT
...
year_2019     INT

看这里:bigquery-public-data.world_bank_global_population.population_by_country

所以,我已经找到了过去 50 年来增长最快的国家。 但是,我如何才能找出哪一年是他们同比增长最强劲的一年?

**通常,窗口函数(例如 lag 与 MAX 结合使用)可以挽救局面,但在这里我必须使用一个遍历列而不是行的函数。 **

这有可能吗?也许每个国家使用一个数组或在 BigQuery 中使用 python?

提前致谢!

我试图将 1960 年定义为滞后函数的偏移量,但这显然不起作用。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    您可能会考虑以下方法。

    CREATE TEMP FUNCTION json_keys(input STRING) RETURNS ARRAY<STRING> LANGUAGE js AS """
      return Object.keys(JSON.parse(input));
    """;
    
    CREATE TEMP FUNCTION json_values(input STRING) RETURNS ARRAY<STRING> LANGUAGE js AS """
      return Object.values(JSON.parse(input));
    """;
    
    WITH stacked_data AS (
      SELECT country, country_code, year, population,
             ROUND(CAST(population AS INT64) / LAG(CAST(population AS INT64)) OVER w - 1, 4) YoY
        FROM `bigquery-public-data.world_bank_global_population.population_by_country` t,
             UNNEST (json_keys(TO_JSON_STRING(t))) year WITH offset
        JOIN UNNEST (json_values(TO_JSON_STRING(t))) population WITH offset USING (offset)
       WHERE year NOT IN ('country', 'country_code')
      WINDOW w AS (PARTITION BY country, country_code ORDER BY year)
    )
    SELECT country, country_code,
           ANY_VALUE(STRUCT(year, population, YoY AS strongest_YoY) HAVING MAX YoY).*
      FROM stacked_data 
     GROUP BY 1, 2;
    

    查询结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-16
      • 2019-06-14
      • 1970-01-01
      • 2020-01-20
      • 2016-12-04
      • 2020-07-16
      • 2012-02-18
      • 2021-04-28
      相关资源
      最近更新 更多