hive-使用开窗函数实现百分比、topN、前百分比

2023-10-31

 有一个订单表A,分别有order_id(订单id)、user_id(用户id)、amt(金额)三个字段,
 用sql实现以下功能:
    i. 求订单总量为top3的用户及交易笔数,同时求出其交易笔数占全量订单笔数的占比。
    ii. 求每个用户top3交易金额的订单。
    iii. 求订单总量从大到小排名在50%之前的用户。

--********************************************************************************************************

--    i. 求订单总量为top3的用户及交易笔数,同时求出其交易笔数占全量订单笔数的占比。


select 
user_id
,count(*) as trade_cnt --交易笔数
,count(*)/sum(count(*))over() as trade_cnt_rate--交易笔数/总交易笔数
from 
(
select 'd001' as order_id,123 as user_id,20 as amt
union all select 'd002' as order_id,123 as user_id,25 as amt
union all select 'd005' as order_id,123 as user_id,250 as amt
union all select 'd007' as order_id,123 as user_id,100 as amt
union all select 'd003' as order_id,125 as user_id,15 as amt
union all select 'd004' as order_id,125 as user_id,39 as amt
union all select 'd006' as order_id,125 as user_id,25 as amt
union all select 'd008' as order_id,125 as user_id,59 as amt
)a
group by user_id
order by 2 desc limit 3

--    ii. 求每个用户top3交易金额的订单。

select user_id,order_id,sort_flag
from 
(
select user_id,order_id
,row_number()over(partition by user_id order by amt desc) as sort_flag
from 
(
select 'd001' as order_id,123 as user_id,20 as amt
union all select 'd002' as order_id,123 as user_id,25 as amt
union all select 'd005' as order_id,123 as user_id,250 as amt
union all select 'd007' as order_id,123 as user_id,100 as amt
union all select 'd003' as order_id,125 as user_id,15 as amt
union all select 'd004' as order_id,125 as user_id,39 as amt
union all select 'd006' as order_id,125 as user_id,25 as amt
union all select 'd008' as order_id,125 as user_id,59 as amt
)a
) t
where sort_flag<=3

--    iii. 求订单总量从大到小排名在50%之前的用户。

select a.user_id
,a.trade_cnt
,a.level
from
(
select user_id
,count(*) as trade_cnt
,ntile(2) over(order by count(*) desc) as level --50%就是1/2
from 
(
select 'd001' as order_id,123 as user_id,20 as amt
union all select 'd002' as order_id,123 as user_id,25 as amt
union all select 'd005' as order_id,123 as user_id,250 as amt
union all select 'd007' as order_id,123 as user_id,100 as amt
union all select 'd004' as order_id,125 as user_id,39 as amt
union all select 'd006' as order_id,125 as user_id,25 as amt
union all select 'd008' as order_id,125 as user_id,59 as amt
union all select 'd009' as order_id,128 as user_id,200 as amt
union all select 'd010' as order_id,128 as user_id,59 as amt
) x
group by user_id
) a
where a.level = 1

 补充:NTILE(n) 用于将分组数据按照顺序切分成n片,返回当前切片值,如果切片不均匀,默认增加第一个切片的分布。NTILE不支持ROWS BETWEEN,比如 NTILE(2) OVER(PARTITION BY cookieid ORDER BY createtime ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hive-使用开窗函数实现百分比、topN、前百分比 的相关文章

随机推荐

  • Unity协同详解以及与多线程的区别使用

    转载自 http blog csdn net linuxheik article details 45392945 1 什么是协调程序 unity协程是一个能暂停执行 暂停后立即返回 直到中断指令完成后继续执行的函数 它类似一个子线程单独出
  • 深入理解Interpreter模式

    1 Interpreter模式是一个能给人留下深刻印象的模式 The Interpreter pattern describes how to define a grammar for simple languages represent
  • 本地容灾异地备份,本地容灾和异地容灾

    关于容来自灾备份 备份也是容灾的一种方式 我们认为应用级的备份是最传统的 在应用层进行复制 一般成本低廉数据级的容灾 只得是从存储层进行备份 这种备份的机制往往是实时的 适合关键的业务 并且能够做到实时的挂载 相对第一种 毕竟成本高一些 但
  • 用chargpt一分钟,一键生成PPT!

    ChatGPT狂飙160天 世界已经不是之前的样子 新建了人工智能中文站https ai weoknow com 每天给大家更新可用的国内可用chatGPT资源 这是 ChatGPT 从入门到精通 第 13 篇基础教程 有同学留言 问 还有
  • 页面缓存————Expires header(顺便提下ASP.NET常用的VaryByParam实现缓存)

    从事ASP NET开发也有1年多了 这期间发生了许许多多的事情 经过苦难的层层磨练 渐渐对ASP NET这个很多人说 简单易掌握 的东西有了逐步的认识和理解 自己也在慢慢的成长 在这1年多的期间非常感谢franky大哥给我前端上的指导 感觉
  • 贝叶斯分类(这个讲的比较清晰,一看就明白)

    原文地址 http www cnblogs com leoo2sk archive 2010 09 17 naive bayesian classifier html 1 2 分类问题综述 对于分类问题 其实谁都不会陌生 说我们每个人每天都
  • HDF5库的下载

    HDF5是科学计算中最常用的分层式数据存储格式 大部分计算软件都需要它的支持 然而 最近在下载HDF5库的时候 我突然发现 官方的下载链接竟然都指向了AWS 在国庆大背景下我的梯子被战略性封闭 于是全部404 不过这样就难住我了嘛 不可能的
  • oracle导出表结构的几种办法,oracle表结构和数据导出时的一些勾选项说明

    使用pl sql developer导出oracle数据库的表结构和表数据时 有一些勾选项供用户选择 需要用户根据实际情况进行勾选或取消 导出方法如下 一 只导出表结构 1 使用pl sql developer登陆数据库 2 选择Tools
  • [Pytorch系列-70]:开发环境 - 可视化工具visdom安装与使用方法

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122073099 目录 第1章 概述
  • IP地址和网络地址及广播地址解析

    IP地址 IP地址有IPV4和IPV6两种 IPV4 由32位二进制数组成 一般用点分十进制来表示 IPV6 由128位组成 一般用冒号分隔 十六进制来表示 IP地址由两部分组成 网络部分 NETWORK 主机部分 HOST 例 192 1
  • 基于iscroll实现下拉和上拉刷新

    基于iscroll实现下拉和上拉刷新 2015 02 07 javascript moblie 插件 iscroll上拉刷新 js上拉刷新 js下拉刷新 在原生APP的开发中 有一个常见的功能 就是下拉刷新的功能 这个想必大家都是知道的 但
  • Sqlite嵌入式内存数据库的优化

    0 场景及问题 目前网关项目在使用Sqlite的数据库存储数据 但是我们使用的方式和一般的数据库使用有区别 导致出现了两个问题 Sqlite3占用内存迅速增长 这种增长是cat proc fd号 statm 的显示增长 区别于 sqlite
  • Android OpenGL ES 2.0绘图:绘制纹理

    http mobile 51cto com aengine 437172 htm public class MyGLSurfaceView extends GLSurfaceView public MyGLSurfaceView Conte
  • PanGu-Coder2华为盘古大模型来了!

    视学算法报道 机器之心编辑部 这次 华为代码生成大模型盘古 Coder2 采用了一种类似于 RLHF 基于人类反馈的强化学习 的框架 相较前代实现了更高的一次生成通过率 随着大模型成为 AI 开发新范式 将大语言模型集成至编程领域 完成代码
  • xenserver VM假死

    使用XenServer作为虚拟化平台 经常会有用户反映虚拟机会假死 并亮起非正常的Yellow图标 a 虚拟机不可用 这种现象发生的非常随机 发生在不固定的主机 不固定的虚拟机上 b 使用XenCenter无法正常的将其ShutDown 包
  • static关键字的四种用法

    在java的关键字中 static和final是两个我们必须掌握的关键字 不同于其他关键字 他们都有多种用法 而且在一定环境下使用 可以提高程序的运行性能 优化程序的结构 下面我们先来了解一下static关键字及其用法 static关键字
  • vue+高德离线地图vue-amap开发

    前言 在使用多次高德离线地图的插件 vue amap 感觉收获还是很多的 这里来整理下相关资料 效果图 目录 实现步骤 源码在最下面 一 安装插件 二 template配置基础的地图组件 三 data里面定义相关数据 四 撒点的实现 1 t
  • 0.96寸OLED屏硬件驱动电路

    0 96寸OLED屏硬件驱动电路 该电路适合把OLED驱动电路集成到自己的板子上 最终的原理图和PCB已经上传CSDN 可直接点击链接下载 https download csdn net download qq 31785559 59594
  • cocos creator入门教程实现简化版贪吃蛇

    开发工具 Cocos Creator和VS Code 开发语言 TS 简化版贪吃蛇的实现主要涉及的功能就是在吃到场景中随机产生产生的物体后 物体会到蛇头的后面并且跟随移动路径 其原理主要是通过数组来存储相关的坐标数据
  • hive-使用开窗函数实现百分比、topN、前百分比

    有一个订单表A 分别有order id 订单id user id 用户id amt 金额 三个字段 用sql实现以下功能 i 求订单总量为top3的用户及交易笔数 同时求出其交易笔数占全量订单笔数的占比 ii 求每个用户top3交易金额的订