BigQuery过滤器,按日期对分类列的每个值显示最后5行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BigQuery过滤器,按日期对分类列的每个值显示最后5行相关的知识,希望对你有一定的参考价值。

抱歉,标题有点罗--我将在下面创建一个示例以突出显示我所指的内容。我有以下信息表:

t1

date        team    num_val
2017-10-04    ab          7  
2017-10-03    ab          6
2017-10-02    ab          8
2017-10-05    ab          3
2017-10-07    ab         12
2017-10-06    ab          3
2017-10-01    ab          5
2017-09-08    cd          4
2017-09-09    cd          8
2017-09-10    cd          2
2017-09-14    cd          1
2017-09-13    cd          5
2017-09-11    cd          6
2017-09-12    cd         13

有了这张桌子,我只是想:

  • 过滤器,对于每个团队,最近的5个日期
  • 按组分组并汇总num_val列

很简单。但是,每个团队的日期都没有押韵或理由(我不能简单地筛选最近的5个日期,因为每个团队的日期可能不同)。我目前有以下查询框架:

SELECT
  team, 
  sum(num_val)
FROM t1
GROUP BY team

...将其带到终点线的任何帮助将不胜感激,谢谢!!

答案

BigQuery Standard SQL的更多选项,所以您会看到不同的方法

选项#1

#standardSQL
SELECT team, SUM(num_val) sum_num FROM (
  SELECT team, num_val, ROW_NUMBER() OVER(PARTITION BY team ORDER BY DATE DESC) pos
  FROM `project.dataset.table`
)
WHERE pos <= 5
GROUP BY team

选项#2

#standardSQL
SELECT team, sum_num FROM (
  SELECT team, 
    SUM(num_val) OVER(PARTITION BY team ORDER BY DATE DESC ROWS BETWEEN CURRENT ROW AND 4 FOLLOWING) AS sum_num, 
    ROW_NUMBER() OVER(PARTITION BY team ORDER BY DATE DESC) pos
  FROM `project.dataset.table`
)
WHERE pos = 1  

如果要从您的问题中获取样本数据-两者都会产生以下结果

Row team    sum_num  
1   ab      31   
2   cd      27     

虽然上述选项在某些更复杂的情况下可能有用-在您的特定情况下-我会选择菲利普答案中给出的选项(类似于一个选项)>

#standardSQL
SELECT team, (SELECT SUM(num_val) FROM UNNEST(num_values)) sum_num
FROM (
  SELECT team, ARRAY_AGG(STRUCT(num_val) ORDER BY DATE DESC LIMIT 5) num_values
  FROM `project.dataset.table`
  GROUP BY team
)
另一答案

每个获取最新的5:

以上是关于BigQuery过滤器,按日期对分类列的每个值显示最后5行的主要内容,如果未能解决你的问题,请参考以下文章

大熊猫在grouby之后按日期时间过滤

如何在 bigquery 中使用 rowid 按日期获取数据集的第一个值,并将给定日期的所有其他值设为 0

BigQuery 按数组条目过滤行

如何从跨两个 DATE 列的 INNER JOIN 创建 MIN 和 MAX 日期列,其中每个 DATE 列来自单独的表 BigQuery

如何在标准 SQL 的 BigQuery 中过滤具有 iso 周值的列?

使用 JavaScript,如何在具有多个值的日期列的表中突出显示“今天”的每个日期