HQL的几个排名函数用法

排序窗口函数

NTILE、ROW_NUMBER、RANK、DENSE_RANK


1、NTILE(n),用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布
2、ROW_NUMBER() 从1开始,按照顺序,生成分组内记录的序列
3、RANK()生成数据项在分组中的排名从1开始,排名相等会在名次中留下空位
4、DENSE_RANK() 生成数据项在分组中的排名,排名相等会在名次中不会留下空位

这4项都不支持row between and

NTILE

CREATE TABLE IF NOT EXISTS test_dp_price(
    id                    STRING COMMENT '店铺id',
    price                 BIGINT COMMENT '价格'
) COMMENT '店铺价格表';

INSERT INTO test_dp_price 
SELECT '1', 10
UNION
SELECT '2', 20
UNION
SELECT '3', 30
UNION
SELECT '4', 40
UNION
SELECT '5', 50
UNION
SELECT '6', 60
UNION
SELECT '7', 70
UNION
SELECT '8', 80
UNION
SELECT '9', 90
UNION
SELECT '10', 100
;



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
;

SELECT  id
        ,price
        ,NTILE(3) OVER (ORDER BY price DESC ) AS rn
FROM    test_dp_price
;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

话数Science

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值