【问题标题】:% change of 2 time period calculations in SQL (GBQ) [closed]SQL(GBQ)中2个时间段计算的百分比变化[关闭]
【发布时间】:2019-10-14 03:03:45
【问题描述】:

目前有多个类似这样的计算:

SELECT SUM(A)/COUNT(B) AS CALCULATION
  FROM TABLE
  WHERE YEAR = 2019

但我想找出 2019 年和 2018 年之间的百分比变化, 喜欢(Calculation1/Calculation2-1) where calc1 is 2019 and calc2 is 2018

最好的方法是临时表还是子查询?完成分析的基本代码是什么?

【问题讨论】:

    标签: sql google-bigquery time-series


    【解决方案1】:

    您可以使用条件聚合。我不确定你到底想要什么计算,但像这样:

    SELECT (SUM(CASE WHEN YEAR = 2019 THEN A END) / SUM(CASE WHEN YEAR = 2018 THEN A) END) - 1 AS CALCULATION
    FROM TABLE
    WHERE YEAR IN (2018, 2019)
    

    【讨论】:

    • “没有与参数类型的函数 IF 匹配的签名:FLOAT64。支持的签名:IF(BOOL, ANY, ANY) 在 [19:8] 了解有关 BigQuery SQL 函数的更多信息。” BQ不支持这种方式使用时间函数吗?
    • @Harri。 . .那里只是一些一厢情愿的想法。 sumif() 在 Wrangle 中受支持,我只是认为它应该在 BigQuery 中也是如此(或者更好的是,BQ 可以支持 filter 子句!)
    • @Harri。 . .如count(distinct case when year = 2018 then a end)?
    【解决方案2】:

    以下是 BigQuery 标准 SQL

    #standardSQL
    SELECT 
      (SUM(IF(year = 2019, A, 0)) / COUNT(IF(year = 2019, B, NULL))) /
      (SUM(IF(year = 2018, A, 0)) / COUNT(IF(year = 2018, B, NULL))) - 1 AS CALCULATION
    FROM `project.dataset.table`
    WHERE year IN (2018, 2019)
    

    【讨论】:

    • 谢谢 Mikhail,有没有办法将 distinct 合并到 COUNT 中?
    • 当然。 SO的工作方式是-您提出问题(顺便说一句,展示自己的努力很重要)-我们回答-您接受/赞成。那么如果你有新问题(就像你现在一样)你问/发布新问题 - 提供所有相关细节以及输入和预期输出示例很重要
    • 知道了 - 我无法对 SO 的声誉级别进行投票。由于我的数据的专有性质,详细程度受到限制。感谢您的帮助。
    • 当然。您无需提供真实数据 - 只需提供虚拟数据即可展示您的用例
    • 使用 COUNT(IF(YEAR = '2018',(DISTINCT B), NULL) 但它不采用独特的“意外关键字”,如果删除,则除法会将我的数字降至零。
    【解决方案3】:

    使用IF。有点难看但更通用的版本:

    with yearlyset as (
      select 
         year, 
         lag(year) over(order by 1) lastyear, 
         coalesce(lag(calculation) over(order by 1), 0) lastyearcalculation, 
         calculation from (
            select year, sum(a)/count(b) as calculation
            from `dataset.table`
            group by 1
         )
    )
    
    select 
       year, 
       if(
          year=2019 and lastyear=2018, 
          calculation/lastyearcalculation-1, 
          if(
             coalesce(lastyearcalculation, 0) = 0, 
             0.0, 
             calculation/lastyearcalculation
          ) 
       ) as percent_change
    from yearlyset
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      相关资源
      最近更新 更多