zoukankan      html  css  js  c++  java
  • Hive Ntile分析函数学习

    NTILE(n)

    • 用于将分组数据按照顺序切分成n片,返回当前记录所在的切片值

    NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)

    • 如果切片不均匀,默认增加第一个切片的分布
    • 经常用来取前30% 带有百分之多少比例的记录什么的

    例子:

    有下图的1000家店铺的价格数据。我们想知道,价格排名前30%的店铺的平均价格,和后70%的。

    思路:

    把店铺均匀的按价格递减顺序分成10片。然后取切片数=1,2,3的即为前30%。

    sql:

    -- 1 把记录按价格顺序拆分成10片
    drop table if exists test_dp_price_rk;
    create table test_dp_price_rk
    as
    select
     id,
     price,
     NTILE(10) OVER (order by price desc) as rn
    from test_dp_price;
    
    -- 2 按片取30%和70%,分别计算平均值
    select
      new_rn,
      max(case when new_rn=1 then 'avg_price_first_30%' when new_rn=2 then 'avg_price_last_70%' end) as avg_price_name,
      avg(price) avg_price
    from 
    (
      select 
        id,
        price,
        rn,
        case when rn in (1,2,3) then 1 else 2 end as new_rn
      from test_dp_price_rk
    )a
    group by new_rn;

    结果展示:

  • 相关阅读:
    BZOJ BLO 1123 (割点)【双连通】
    P4291 [HAOI2008]排名系统
    P3165 [CQOI2014]排序机械臂
    P3224 [HNOI2012]永无乡
    P1169 [ZJOI2007]棋盘制作
    P2303 [SDOi2012]Longge的问题
    P2216 [HAOI2007]理想的正方形
    P2473 [SCOI2008]奖励关
    P2617 Dynamic Rankings
    P2518 [HAOI2010]计数
  • 原文地址:https://www.cnblogs.com/skyEva/p/7552129.html
Copyright © 2011-2022 走看看