• SQL之开窗函数二——在复杂场景中的实际运用


    1.使用开窗函数求移动平局值

    大家看股票的时候,经常会看到K线图,里面经常用到的5日、30日移动平均趋势图,那如何使用窗口函数求移动平均值呢

    (1)现有一张表Stock,求5日 移动平均值

    原表数据结构如下:

     

     

    查询5日平均价格语句:

    select stockname
    ,TradingDate
    ,price
    ,avg(price) over(partition by stockname 
    order by tradingdate rows between 4 preceding and current row) 
    as fievedaysavgprice
    from Stock

    结果如下:

     语法总结:

    sum(...A...) over(partition by ...B... order by ...C... rows between ... D1... and ...D2..) 

    avg(...A...) over(partition by ...B... order by ...C... rows between ... D1... and ...D2..) 

    A:需要被加工的字段名称

    B:分组的字段名称

    C:排序的字段名称

    D:计算的行数范围

    rows between unbounded prceding and current row --包括本行和之前所有的行

    rows between current row and unbounded following --包括本行和之后所有的行

    rows between 3 preceding and current row --包括本行以内和前三行

    rows between 3 preceding and 1 following --从前三行到下一行 (5行)

    2.分组排序窗口函数实际运用 ntile (n)over(......)

    ntile(n) over(partition by ...A... order by ...B...)

    n:切片的片数

    A:分组的字段名称 

    B:排序的字段名称

    ntile(n) :用于将分组数据按照顺序切分成n片,返回当前切片值

    如果切片不均匀,默认增加到第一个切片的分布

    例子:选出2021年退款金额排名前20%的用户 

    原数据表:user_refund

     

    查询退款20%的语句:具体分析就是按照用户退款金额总数降序分成5组,取第一组的数据

    select * 
    from 
    (
    select [user_name] 
    ,sum(refund_amount) as refund_amount
    ,ntile(5) over(order by sum(refund_amount) desc) as level
    from user_refund 
    where year(refund_time)=2021
    group by [user_name]
    )
    as a where a.level=1

     

  • 相关阅读:
    【Django Admin皮肤】 Simpleui 自定义常用 持续更新中...
    【webSokect】基于django Channels的简单实现
    【webSocket】实现原理
    【webSocket】长轮询
    【前端实时时间】JS原生代码
    【数据结构的补全整理】规定在周一到周五中,赛选出8点到18点中的计划安排,空计划时刻补全空值
    JS面试经典知识(一)
    Python中 zipfile 出现乱码
    Linux shell 对数据进行归档
    Linux 函数的使用
  • 原文地址:https://www.cnblogs.com/hobelee/p/15615490.html
Copyright © 2020-2023  润新知