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行的主要内容,如果未能解决你的问题,请参考以下文章
如何在 bigquery 中使用 rowid 按日期获取数据集的第一个值,并将给定日期的所有其他值设为 0
如何从跨两个 DATE 列的 INNER JOIN 创建 MIN 和 MAX 日期列,其中每个 DATE 列来自单独的表 BigQuery