代码之家  ›  专栏  ›  技术社区  ›  Winston Li

计算BigQuery中列的中值差-分析函数不能作为聚合函数的参数

  •  1
  • Winston Li  · 技术社区  · 2 年前

    我有一列所有的数字 id 。我想得到ID之间差值的中值。例如,如果id(按升序排序)为[1,5,30,35],则差值为[4,25,5]和中值。将是5。

    我试过了

    SELECT id - LAG(id) OVER (order by id) FROM `table` ORDER BY id ASC
    

    这产生了一系列的差异。但是,如果我尝试

    SELECT AVG(id - LAG(id) OVER (order by id)) FROM `table` ORDER BY id ASC
    

    PERCENTILE_CONT(x, 0.5) 对于中值,我得到一个错误,说分析函数不能是聚合函数的自变量。我该如何解决这个问题?

    谢谢

    1 回复  |  直到 2 年前
        1
  •  1
  •   GMB    2 年前

    不能像那样混合窗口函数和聚合函数。您需要使用 lag() 在子查询中 ,然后在外部查询中聚合:

    select avg(id - lag_id) avg_id_diff
    from (
        select id, lag(id) over(order by id) lag_id
        from mytable 
    ) t
    

    如果您正在寻找中位数差异而不是平均值:

    select percentile_cont(id - lag_id, 0.5) over() mediam_id_diff
    from (
        select id, lag(id) over(order by id) lag_id
        from mytable 
    ) t
    limit 1
    

    percentile_cont 仅作为窗口函数(而不是聚合函数)可用,这就是我们使用 over() limit 条款。