sql——滑动窗口

530 阅读1分钟

普通窗口函数

sum( __ ) over(partition by __ oder by __ )

avg( __ ) over(partition by __ oder by __ )

count( __ ) over(partition by __ oder by __ )

rank() over(partition by __ oder by __ )

row_number() over(partition by __ oder by __ )

滑动窗口函数(只计算某些行的聚合)

在两个点之间滑动计算,用以下语句指定起点和终点:

sum(__)   over(partition by __ order by __
               ROWS BWTWEEN <start> AND <finish> )

<strat><finish>关键字如下:

2 PRECEDING   #指定前2行
2 FOLLOWING   #指定后2行
UNBOUNDED PRECEDING  #前面所有行
YNBOUNDED FOLLOWING  #后面所有行
CURRENT ROW   #当前行

eg: SQL160 国庆期间每类视频点赞量和转发量

with t as(
    select 
    tag
    ,date_format(start_time,'%Y-%m-%d') daytime
    ,sum(if_like) like_cnt 
    ,sum(if_retweet) retweet_cnt
    from tb_user_video_log a 
    left join tb_video_info b
    on a.video_id = b.video_id
    where datediff('2021-10-03',date_format(start_time,'%Y-%m-%d')) < 9
    group by tag,date_format(start_time,'%Y-%m-%d')
)
select tag,daytime,like_cnt,retweet_cnt,
sum(like_cnt) over(partition by tag order by daytime rows 6 preceding),
max(retweet_cnt) over(partition by tag order by daytime rows 6 preceding),
sum(like_cnt) over(partition by tag order by daytime),
max(retweet_cnt) over(partition by tag order by daytime)
from t 
tagdaylike_cntretweet_cntsum_likesum_retweetsum_like6sum_retweet6
旅游2021-09-26011212
旅游2021-09-27102222
旅游2021-09-28012222
旅游2021-09-29012222
旅游2021-09-30113232
旅游2021-10-01215252
旅游2021-10-02135363
旅游2021-10-03106373