首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用bigquery从移动窗口中查找前一天的最大值,前一天的第二天

使用bigquery从移动窗口中查找前一天的最大值,前一天的第二天
EN

Stack Overflow用户
提问于 2022-01-25 12:58:09
回答 2查看 59关注 0票数 0

我需要从每天对应的原始值列表(val_prev_day)中找到前一天(Val_prev_day )、前一天第二天(val_sec_prev_day )、第三天(val_third_prev_day)的最大值,如下例所示。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-26 10:09:09

考虑以下方法

代码语言:javascript
复制
select day, val_raw,
  max(val_raw) over(prev_days range between 1 preceding and 1 preceding) val_prev_day, 
  max(val_raw) over(prev_days range between 2 preceding and 2 preceding) val_sec_prev_day, 
  max(val_raw) over(prev_days range between 3 preceding and 3 preceding) val_third_prev_day, 
from your_table
window prev_days as (order by unix_date(day))   

如果应用于样本数据,如在您的问题-输出是

我使用下面的虚拟数据来测试上面的内容

代码语言:javascript
复制
with your_table as (
  select date '2022-01-01' as day, 0 as val_raw, union all 
  select '2022-01-01',  10, union all 
  select '2022-01-01', 110, union all 
  select '2022-01-02',  30, union all 
  select '2022-01-02',  70, union all 
  select '2022-01-02',  90, union all 
  select '2022-01-03',   0, union all 
  select '2022-01-03',   5, union all 
  select '2022-01-03',   5, union all 
  select '2022-01-04',   0, union all 
  select '2022-01-04',   5, union all 
  select '2022-01-04',  10 
)
票数 1
EN

Stack Overflow用户

发布于 2022-01-26 09:21:13

我假设dataset模式,但基本上您可以在shift days中使用subqueries并执行LEFT OUTER JOIN

代码语言:javascript
复制
WITH
dataset AS (
    SELECT           1 as day,   0 as val_raw,
    UNION ALL SELECT 1 as day,  10 as val_raw,
    UNION ALL SELECT 1 as day, 110 as val_raw,
    UNION ALL SELECT 2 as day,  30 as val_raw,
    UNION ALL SELECT 2 as day,  70 as val_raw,
    UNION ALL SELECT 2 as day,  90 as val_raw,
    UNION ALL SELECT 3 as day,   0 as val_raw,
    UNION ALL SELECT 3 as day,   5 as val_raw,
    UNION ALL SELECT 3 as day,   5 as val_raw,
    UNION ALL SELECT 4 as day,   0 as val_raw,
    UNION ALL SELECT 4 as day,   5 as val_raw,
    UNION ALL SELECT 4 as day,  10 as val_raw,
),
shift_one_day_max AS (
    SELECT day + 1 as day, max(val_raw) as max_val,
    FROM dataset
    GROUP BY day
),
shift_two_day_max AS (
    SELECT day + 2 as day, max(val_raw) as max_val,
    FROM dataset
    GROUP BY day
)
SELECT *
FROM dataset
LEFT OUTER JOIN shift_one_day_max USING (day)
LEFT OUTER JOIN shift_two_day_max USING (day)
;

c.f.我省略了event_ts,因为它不影响操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70849031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档