【问题标题】:Bigquery - aggregate while filtering out valuesBigquery - 在过滤掉值的同时聚合
【发布时间】:2023-02-14 18:15:11
【问题描述】:

我确定这个问题已在其他地方得到解答,但我找不到。

我有一张发票表

id company index date_sent amount
1 Com1 1 2022-01-01 100
2 Com1 2 2022-02-01 100
3 Com1 3 2022-03-01 100
4 Com1 4 2022-04-01 100
5 Com2 1 2022-02-01 100
6 Com2 2 2022-03-01 100
7 Com2 3 2022-04-01 100
8 Com3 1 2022-01-01 100
9 Com3 2 2022-02-01 100
10 Com4 1 2022-01-01 100

(这里的索引基本上是通过RANK() OVER (PARTITION BY co ORDER BY date_sent) as index添加的)

我想退回拥有超过 3 张发票的公司、这 3 张发票的总和以及第 3 张发票的发送日期。

比如上面的数据,返回的数据应该是:

company date_3rd amount_sum_3
Com1 2022-03-01 300
Com2 2022-04-01 300

到目前为止,我有:

select company,
  (select sum(amount) from grouped_invs.amount_sum_3 amount) as amount_sum_3,
from (
  select company,
    array_agg(invoices.amount order by invoices.index limit 3) amount_sum_3,
  from `data` invoices
  group by invoices.company
  having count(*) => 3
) grouped_invs

这给了我

company amount_sum_3
Com1 300
Com2 300

但我不知道如何从那里发送第三个日期。

提前致谢

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    您可能会考虑以下

    SELECT (SELECT AS STRUCT
              ANY_VALUE(invoices.company) AS company,
              MAX(invoices.date_sent) date_3rd,
              SUM(invoices.amount) amount_sum_3
            FROM grouped_invs.amount_sum_3 LIMIT 1).*
      FROM (
        SELECT ARRAY_AGG(STRUCT(invoices) ORDER BY index LIMIT 3) amount_sum_3
          FROM `data` invoices
         GROUP BY invoices.company HAVING COUNT(*) >= 3
      ) grouped_invs;
    

    查询结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多