SQL将会员按照总消费金额从高到低分成50档。(分档、分组)

2023-10-30

【面试题】

“交易表”有4个字段:订单号、会员id、消费金额、购买时间。

问题:将会员按照总消费金额从高到低分成50档。

【解题步骤】

1. 解题思路

将某一个字段按区间分档,最先想到的是《猴子 从零学会SQL》里讲过的多条件语句(case when)。

但是,如果分成50档,需要写50个case when,显然不太实际,有没有更好的解决办法呢?

我们还可以通过最大值、最小值和分档数量三个信息来实现:

2. 找到最大值和最小值

首先,使用group by获取每个会员的“总消费金额”。


select 会员id,
       sum(消费金额) as 总消费金额
from 交易表
group by 会员id;

 

把这个SQL命名为子查询t1。

再获取“最低总消费金额”和“最高总消费金额”。


select min(总消费金额) as 最低总消费金额   
from t1;

把这个SQL命名为子查询a1。


select max(总消费金额) as 最高总消费金额
from t1;

 

把这个SQL命名为子查询a2。

3. 计算区间长度

区间长度 = (最大值 - 最小值) / 分档数量

为了计算50档“总消费金额”的“区间长度”,使用多表联结将子查询 t1、a1、a2 联结。

为了保留所有会员id的记录,所以t1为左表,使用左联结。


select t1.*,
       a1.最低总消费金额,
       a2.最高总消费金额,
       (a2.最高总消费金额-a1.最低总消费金额)/50 as 区间长度
from t1
left join a1 on 1 = 1
left join a2 on 1 = 1;

小技巧:两表联结时,使用 1=1 得到两表的笛卡尔积。

将子查询 t1、a1、a2 代入:

select t1.*,
       a1.最低总消费金额,
       a2.最高总消费金额,
       (a2.最高总消费金额-a1.最低总消费金额)/50 as 区间长度
from (
select 会员id,
       sum(消费金额) as 总消费金额
from 交易表
group by 会员id
) as t1
left join (
select min(总消费金额) as 最低总消费金额
from (
select 会员id,
       sum(消费金额) as 总消费金额
from 交易表
group by 会员id
) as t1
) as a1 on 1 = 1
left join (
select max(总消费金额) as 最高总消费金额
from (
select 会员id,
       sum(消费金额) as 总消费金额
from 交易表
group by 会员id
) as t1
) as a2 on 1 = 1;

 

把这个SQL命名为子查询t2。

4. 计算档位

基于“总消费金额”、“最高总消费金额”和“区间长度”计算“档位”。

x = (最高总消费金额-总消费金额)/区间长度

将以上结果向上取整数(使用ceil函数),即“总消费金额从高到低”的档位。


select 会员id,
       总消费金额,
       ceil((最高总消费金额-总消费金额)/区间长度) as 档位
from t2;

 

“M003”会员消费金额最低,档位是50;而“M005”会员消费金额最高,档位却是0,正确结果应为1。

原因是0向上取整还是0,这里需要特殊处理。

特殊情况的处理一般也是使用《猴子 从零学会SQL》里讲过的多条件语句(case when)。

最终结果为:


select 会员id,
       总消费金额,
       case when ceil((最高总消费金额-总消费金额)/区间长度) = 0 then 1 else ceil((最高总消费金额-总消费金额)/区间长度) end as 档位
from t2;

将子查询t2代入:

select 会员id,
       总消费金额,
       case when ceil((最高总消费金额-总消费金额)/区间长度) = 0 then 1 else ceil((最高总消费金额-总消费金额)/区间长度) end as 档位
from (
select t1.*,
       a1.最低总消费金额,
       a2.最高总消费金额,
       (a2.最高总消费金额-a1.最低总消费金额)/50 as 区间长度
from (
select 会员id,
       sum(消费金额) as 总消费金额
from 交易表
group by 会员id
) as t1
left join (
select min(总消费金额) as 最低总消费金额
from (
select 会员id,
       sum(消费金额) as 总消费金额
from 交易表
group by 会员id
) as t1
) as a1 on 1 = 1
left join (
select max(总消费金额) as 最高总消费金额
from (
select 会员id,
       sum(消费金额) as 总消费金额
from 交易表
group by 会员id
) as t1
) as a2 on 1 = 1
)t2;

【本题考点】

1)考查对分组汇总的了解,以及灵活使用来解决业务问题;

2)考查对多表联结的了解,以及灵活使用来解决业务问题;

3)考查对分档问题的解决能力。

 

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

SQL将会员按照总消费金额从高到低分成50档。(分档、分组) 的相关文章

随机推荐

  • 2016——大数据版图

    编者注 原文是 FirstMark Capital 的 Matt Turck 的文章 本文全面总结了大数据领域的发展态势 分析认为尽管大数据作为一个术语似乎已经过气 但是大数据分析与应用才刚刚开始兴起 在与 AI 人工智能等新兴技术的结合下
  • JSON格式转MAP的6种方法

    JSON字符串自动转换 Created by zkn on 2016 8 22 public class JsonToMapTest01 public static void main String args String str 0 zh
  • MySQL中的各种自增ID

    微信搜索 coder home 或扫一扫下面的二维码 关注公众号 第一时间了解更多干货分享 还有各类视频教程资源 扫描它 带走我 文章目录 背景 自增ID的数据类型 单位换算规则 自增ID取值范围 无符号位的计算方式 有符号位的计算方式 i
  • JDialog弹窗

    JDialog弹窗 package com chen lesson4 import javax swing import java awt import java awt event ActionEvent import java awt
  • python后端学习(二)TCP客户端和服务端

    TCP简介 TCP协议 传输控制协议 英语 Transmission Control Protocol 缩写为 TCP 是一种面向连接的 可靠的 基于字节流的传输层通信协议 由IETF的RFC 793定义 TCP通信需要经过创建连接 数据传
  • 14 【接口规范和业务分层】

    14 接口规范和业务分层 1 接口规范 RESTful架构 1 1 什么是REST REST全称是Representational State Transfer 中文意思是表述 编者注 通常译为表征 性状态转移 它首次出现在2000年Roy
  • android EditText 实时监听输入框的内容

    在开发中很多时候我们都会用到EditText 对输入内容的实时监听也是不可或缺的 在android中为我们提供了TextWatcher这个类 我们只要extends这个类然后etColler addTextChangedListener e
  • C#基础知识框架整理

    目录 NET FrameWork框架 NET平台 类库 快速启动vs sln文件的使用 在解决方案里 csprog文件的使用 在项目文件夹里 排除语法错误 设置行号 设置字体 恢复出厂设置 自动切换运行的项目 C 的3种注释符 C 常用的快
  • 浙大计算机学院博士毕业论文要求,浙大在读博士需要3篇SCI 论文才能毕业,清华博士却不作要求!...

    原标题 浙大在读博士需要3篇SCI 论文才能毕业 清华博士却不作要求 最近 又进入了一年的秋招季 很多学子纷纷加入求职大军之中 但是今年却有不一样的声音 有在读研究生表示 学校对毕业要求提高 要在专业期刊发表论文 这成了比找工作更让人烦心的
  • Java整合七牛云进行文件的上传与下载

    一 七牛云的对象存储的介绍 七牛云对象存储 Kodo 是七牛云提供的高可靠 强安全 低成本 可扩展的存储服务 您可通过控制台 API SDK 等方式简单快速地接入七牛存储服务 实现海量数据的存储和管理 通过 Kodo 可以进行文件的上传 下
  • Filter与Listener

    目录 Filter 1 Filter概念 2 Filter快速入门 3 Filter细节 1 web xml配置 2 Filter执行流程 3 Filter生命周期方法 4 Filter配置详解 拦截路径配置 拦截方式配置 1 注解配置 2
  • micropython下载及安装编译过程

    本文根据 参考文献 实现基于Black F407VE开发板的micropython移植 为后期 stm32H743的 micropython作准备 参考 http docs micropython org en latest 1 下载mic
  • k8s 实战之路

    k8s就是kubernetes 关于k8s 基本属于运维的范畴 一般除了一线大厂会有自研的运维平台和运维团队去做这些事 其他的中小型公司都会要求自己的研发人员懂这些运维的东西 还有nginx等 k8s 刚接触 目前还没有在现实工作中实际操作
  • java 继承 异常_Java异常以及继承的一些问题

    Java异常以及继承的一些问题 类之间的关系 java异常类层次结构图 Throwable Throwable是 Java 语言中所有错误或异常的超类 Throwable包含两个子类 Error 和 Exception 它们通常用于指示发生
  • 【vue】el-upload 图片上传的封装

  • Android DataBinding的基本使用

    5 DataBinding https developer android com topic libraries data binding custom conversions 数据绑定库是一种支持库 借助该库 您可以使用声明性格式 而非
  • 基于pytorch的LSTM进行字符级文本生成实战

    基于pytorch的LSTM进行字符级文本生成实战 文章目录 基于pytorch的LSTM进行字符级文本生成实战 前言 一 数据集 二 代码实现 1 导入库及LSTM模型构建 2 数据预处理函数 3 训练函数 4 预测函数 5 文本生成函数
  • Searching the String 【ZOJ - 3228】【AC自动机+last跳板优化时间】

    题目链接 这次要求的有两个 分别是0 1 代表着的是可以重叠 以及不可以重叠的遍历到该单词的次数 可以重叠的很容易 遇到的时候 就直接加上就是了 但是不可以重叠的时候呢 就需要看到该单词它和上一次的状态出现的距离差了 看一下是否比这个单词长
  • Qt中使用QProcess调用第三方程序

    在Qt中调用第三方程序通常使用QProcess进行调用 以下描述QProcess常用的接口 1 QProcess startDetached QProcess startDetached const QString program cons
  • SQL将会员按照总消费金额从高到低分成50档。(分档、分组)

    面试题 交易表 有4个字段 订单号 会员id 消费金额 购买时间 问题 将会员按照总消费金额从高到低分成50档 解题步骤 1 解题思路 将某一个字段按区间分档 最先想到的是 猴子 从零学会SQL 里讲过的多条件语句 case when 但是