SQL面试题——飞猪SQL面试 重点用户
飞猪SQL面试题—重点用户
在一些场景中我们经常听到这样的一些描述,例如20%的用户贡献了80%的销售额,或者是20%的人拥有着80%的财富,你知道这样的数据是怎么算出来的吗
数据如下,uid 是用户的id ,amount是用户的消费金额
|uid|amount|
+---+------+
| 1| 20|
| 2| 19|
| 3| 3000|
| 4| 200|
| 5| 300|
| 6| 2000|
| 7| 10|
| 8| 3|
| 9| 2|
| 10| 1|
| 11| 1|
| 12| 4000|
| 13| 5|
| 14| 5|
+---+------+
现在我们需要
- 计算出贡献出90%的销售额的用户
- 贡献出90%的销售额用户的人数占比
这里的计算逻辑就是按照用户的销售额从大到小进行累加,找到超过90的临界点,那这些用户就是我贡献出90%的销售额的用户,是重点用户。
计算出当前销售额和累计销售额的占比
首先我们计算出当前销售额和累计销售额,我们直接使用sum 窗口函数即可,这里我们没有partition by ,因为我们就是计算全部,不需要分组
select uid,amount,sum(amount)over(order by amount desc) as cur_amount,sum(amount)over() as total_amount
from amount
有了cur_amount和total_amount 计算占比就很简单了
select uid,amount,round(sum(amount)over(order by amount desc) /sum(amount)over(),2) as rate
from amount

找到临界点
其实这个这个时候我们可以看到在第三个用户也就是用户id 为6的那一行,累计销售占比已经超过了90%,也就是94%,此时的用户id 是13、3、6,这个时候我们的问题是我们要怎么把三个用户提出来呢
一般这个时候我们有两种实现方式
- 排序,就像提取分组前几一样,我们通过序号小于等于多少
- 标志位,满足的都是true 不满足的都是false,或者满足的都是1不满足的都是0
我们这个场景很明显用排序不是那么方便,因为这里的百分比值没有准确等于90%的,跟排序不一样,所以我们用标志位,我们要的数据用true 表示,不要的用false 表示
这里我们判断true 的逻辑是
- rate 小于0.9
- 当前rate 大于等于0.9,但是前面一个rate 小于0.9,那么此时当前记录包括之前的记录都是我们需要的,当前记录就是边界
selectuid,amount,rate,if(rate<0.9 or (rate>0.9 and lag(rate,1,0)over(order by amount desc)<0.9),true,false) as flag
from(select uid,amount,round(sum(amount)over(order by amount desc) /sum(amount)over(),2) as ratefrom amount
)tmp

我们可以看到数据是正确的,最后汇总一下
selectflag,count(1)
from(selectuid,amount,rate,if(rate<0.9 or (rate>0.9 and lag(rate,1,0)over(order by amount desc)<0.9),true,false) as flagfrom(select uid,amount,round(sum(amount)over(order by amount desc) /sum(amount)over(),2) as ratefrom amount)tmp
)
group by flag
grouping sets(flag,null)

总共14个人中,3个人的消费占了90%的总消费额
相关文章:
SQL面试题——飞猪SQL面试 重点用户
飞猪SQL面试题—重点用户 在一些场景中我们经常听到这样的一些描述,例如20%的用户贡献了80%的销售额,或者是20%的人拥有着80%的财富,你知道这样的数据是怎么算出来的吗 数据如下,uid 是用户的id ,amount是用户的消费金额 |uid|amount| ---…...
Angular 和 Vue2.0 对比
前言 :“业精于勤,荒于嬉;行成于思,毁于随” 很久没写博客了,大多记录少进一步探查。 Angular 和 Vue2.0 对比: 一.概念 1.1 Angular 框架: 是一款由谷歌开发的开源web前端框架(核…...
websocket服务器(协程风格)--swoole进阶篇
swoole的websocket服务器(协程风格)示例真不算友善,从头了解到尾,那还好,但是谁有那么多时间从头到尾了解。示例不够针对性,写websocket就该单独写websocket的东西,偏偏又加上http的东西。这里我来解读一下websocket服务器(协程风格)示例 <?php use Swoole\Http\…...
Windows C/C++ Socket 编程
承接上文:socket 编程 本文目录 Windows Client 端WSADATA 结构体WSAStartup() 函数SOCKET 以及 socket() 函数sockaddr_ininet_pton() 函数in_addr structmemcpy()connect() 函数send() 函数recv() 函数 Windows Server 端 在进行 socket 编程之前,你要…...
计算两个结构的乘法
在行列可自由变换的平面上,2点结构有3个 3点结构有6个 计算2*2 2a1*2a14a6 2a1*2a24a8 2a1*2a34a12 显然2a1*2a14a6因为这3个结构都分布在同一列上,就是整数乘法。2a1*2a2的结果有2种写法,一种外形像2a1细节为2a2,一种外形为2…...
学校服务器连接pycharm配置2
上一个可能还是有点问题,因为实际在跑的时候读取的其实是本地的anaconda,这个重新整了一下流程 首先在学校服务器先激活自己创建的虚拟环境,这里就不截图了 然后在pycharm里面打开设置 选择这个python解释器 这里有添加解释器 选择SSH …...
AI赋能电商:创新应用提升销售与用户体验
目录 一、引言 二、AI技术在电商领域的创新应用 三、AI技术提高电商销售效率和用户体验的实践路径 一、引言 随着人工智能(AI)技术的不断成熟,电商行业正迎来一场深刻的变革。AI技术在购物推荐、会员分类、商品定价等方面的创新应用&…...
详解kafka消息发送重试机制的案例
在 Kafka 生产者中实现消息发送的重试机制,可以通过配置 KafkaProducer 的相关属性来实现。以下是一些关键的配置项: retries:设置生产者发送失败后重试的次数。 retry.backoff.ms:设置生产者在重试前等待的时间。 buffer.memo…...
linux文本管理!!!
文章目录 第1章 文本过滤/查看命令1.echo:输出文本2.cat:合并文件或查看文件内容3.head:显示文件头部信息4.tail:显示文件尾部信息5.wc: 统计文本行号6.less:分页显示文件内容7.grep:文本过滤工具8.定向符号…...
软件设计师-计算机体系结构分类
计算机体系结构分类 Flynn分类法 根据不同的指令流数据流组织方式分类单指令流但数据流SISD,单处理器系统单指令多数据流SIMD,单指令流多数据流是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据矢量”)中的每一…...
《基于深度学习的车辆行驶三维环境双目感知方法研究》
复原论文思路: 《基于深度学习的车辆行驶三维环境双目感知方法研究》 1、双目测距的原理 按照上述公式算的话,求d的话,只和xl-xr有关系,这样一来,是不是只要两张图像上一个测试点的像素位置确定,对应的深…...
jwt用户登录,网关给微服务传递用户信息,以及微服务间feign调用传递用户信息
1、引入jwt依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency> 2、Jwt工具类,生成token以及解析token package com.niuniu.gateway.uti…...
ubontu安装anaconda
1.下载 Anaconda 安装脚本 2. 复制到服务器上/home/username文件夹中,进入文件夹,执行: bash Anaconda3-2024.10-1-Linux-x86_64.sh一直按回车,然后输入yes同意协议。 3. 初始化 Anaconda 环境,会自动配置环境变量&a…...
【Docker容器化技术】docker安装与配置、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
文章目录 一、Docker的安装与配置1、docker概述2、安装docker3、docker架构4、配置镜像加速器 二、Docker命令1、服务相关命令2、镜像相关命令3、容器相关命令 三、Docker容器数据卷1、数据卷概念及作用2、配置数据卷3、配置数据卷容器 四、Docker应用部署实战1、部署MySQL2、部…...
Python模拟A卷实操题
1.某机械公司生产两种产品。A的单件利润分别是100元,B的单件利润是150元。 每种产品由三种材料构成,现给出每种材料的库存(库存小于100000),求利润最大的生产方案。输入说明:第一行给出生产每件A产品所需要…...
Leetcode 检测相邻递增子数组
3349. 检测相邻递增子数组 I 给你一个由 n 个整数组成的数组 nums ,请你找出 k 的 最大值,使得存在 两个 相邻 且长度为 k 的 严格递增 子数组 。具体来说,需要检查是否存在从下标 a 和 b (a < b) 开始的 两个 子数组,并满…...
rockylinux 8安装 gcc11.2
方法 1:从源代码编译安装最新版本的 GCC 下载 GCC 源代码: 访问 GCC 官方网站下载最新版本的源代码,例如: wget https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.gz tar -xf gcc-11.2.0.tar.gz cd gcc-11.2.0安装依赖项&a…...
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-奇数序列排序
C L13 奇数序列排序 给定一个长度为N的正整数序列, 请将其中的所有奇数取出,并按增序(从小到大)输出。 输入: 共2行 第1行是一个正整数 N(不大于500); 第2行有 N 个正整数&#x…...
【AI】好用的AI记录
好用的AI 一、国内 KIMI通义 二、国外 GPT4Cursorv0...
linux安装boost.python
前言 boost.python库被用于C与Python代码间的交互,提供了两者间大部分数据类型的转换 相关环境 操作系统:Ubuntu 20.04 python版本:Python 3.8 boost版本:boost 1.78.0 安装 1.boost.python检查与卸载 在安装boost之前需要检…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
【iOS】 Block再学习
iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...
