【问题标题】:How to do a trailing sum on an extremely large table如何在一个非常大的桌子上做一个尾随总和
【发布时间】:2019-12-05 22:12:56
【问题描述】:

我有一个包含 220 亿行的表,我被要求对某些指标进行 30 天的尾随求和,按天分区,然后按产品分区。我在网上找到的答案建议使用自联接来确定这个尾随总和,但是在一个如此大的表上,我什至从基于成本的角度来测试它都非常犹豫。

有没有一种方法可以在不进行极其昂贵的自联接的情况下计算尾随总和?

【问题讨论】:

  • 第一次运行后,您很可能会通过添加新部件并移除太旧的部件来获得更快的方法......(将结果移动一天,而不是 220 亿)跨度>
  • 对不起,我应该更清楚。我被要求汇总一个指标,将每一天除以每个产品组,当天的每个总数都是过去 30 天的尾随总和;
  • 如果近似结果很好,使用 HyperLogLog 会以极快的速度做到这一点stackoverflow.com/a/54816697/132438
  • 好的,我想出了一个解决方案。在 bigquery 分析中使用 Over 函数来减少它正在执行自连接的范围,然后将尾随结果存储在管道中自己的表中。然后使用特定于请求的分区来处理它以获得我需要的东西。

标签: sql google-bigquery


【解决方案1】:

您将使用窗口函数。如果每个日期只有一行:

select t.*,
       sum(val) over (partition by day, product
                      order by date
                      rows between 29 preceding and current row
                     ) as sum_30
from t;

如果您想要 30 天并且可能存在间隔,那么您需要将日期转换为数字,您可以使用 unix_date()。那将是:

select t.*,
       sum(val) over (partition by day, product
                      order by unix_date(date)
                      range between 29 preceding and current row
                     ) as sum_30
from t;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多