sql专场练习(一)(最后五题 21-25)

news2024/11/6 8:10:44

第21题:找出恶意购买用户

create table sql1_21(
    order_id int,
    user_id string,
    order_status string,
    operate_time string
)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties(
  'input.regex'='(\\d+)\\s+(.+?)\\s+(.+?)\\s+(.+?)'
);
load data local inpath '/home/homedata/sql_1/sql1_21.txt' into table sql1_21;

order_id    user_id    order_status     operate_time
1101         a         已支付        2023-01-01 10:00:00
1102         a         已取消        2023-01-01 10:10:00
1103         a         待支付        2023-01-01 10:20:00
1104         b         已取消        2023-01-01 10:30:00
1105         a         待确认        2023-01-01 10:50:00
1106         a         已取消        2023-01-01 11:00:00
1107         b         已取消        2023-01-01 11:40:00
1108         b         已取消        2023-01-01 11:50:00
1109         b         已支付        2023-01-01 12:00:00
1110         b         已取消        2023-01-01 12:11:00
1111         c         已取消        2023-01-01 12:20:00
1112         c         已取消        2023-01-01 12:30:00
1113         c         已取消        2023-01-01 12:55:00
1114         c         已取消        2023-01-01 13:00:00

        恶意购买的用户定义是:同一个用户,在任意半小时内(含),取消订单次数>=3次的就被视为恶意买家。——这道题主要在于range 的使用,range可以用于固定窗口的大小,range是根据值的范围进行固定的,而rows是根据行数。

with t1 as (
    select order_id, user_id, unix_timestamp(operate_time) operate_time
    from sql1_21 where order_status = "已取消"
)
select user_id,
       count(*) over (partition by user_id order by operate_time range between 3600 preceding and current row )
from t1;

第22题:取每个保单的最大保单版本编号的证件号以及客户名称

create table sql1_22(
   x1  String, -- 保单编号
   x2  String, -- 客户名称
   x3  String, -- 证件号
   x4  Int --保单版本编号
)
row format delimited
fields terminated by ",";

insert into sql1_22 values('01','a','001',3),('02','b','002',2),('03','c','003',1), ('01','d','004',2),('02','e','005',1),('01','f','006',1);

        直接group by即可

select x1,concat_ws(",",collect_list (x2)) x2 ,min(x3) x3 from sql1_22 group by x1;

第23题:获取班级前3名,以及他们的分差

create table sql1_23(
Stu_no int,
class string,
score int
)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties(
  'input.regex'='(\\d+)\\s+(.+?)\\s+(\\d+)'
);
load data local inpath '/home/homedata/sql_1/sql1_23.txt' into table sql1_23;


Stu_no class score 
1        1901        90
2        1901        90
3        1901        83
4        1901        60
5        1902        66
6        1902        23
7        1902        99
8        1902        67
9        1902        87

        实现每班前三名,分数一样不并列,同时求出前三名按名次排序的一次的分差

with t1 as (
    select *,row_number() over (partition by class order by score desc ) rowNumber from sql1_23
)
select *,
    `if`( rowNumber = 1,score,score - lag(score,1,score) over (partition by class order by rowNumber  ))  diff_score 
from t1 where rowNumber <=3;

第24题:间隔连续问题

create table sql1_24(
    id int,
    dt string
)
row format delimited
fields terminated by ' ';
load data local inpath '/home/homedata/sql_1/sql1_24.txt' into table sql1_24;


id dt
1001 2021-12-12
1002 2021-12-12
1001 2021-12-13
1001 2021-12-14
1001 2021-12-16
1002 2021-12-16
1001 2021-12-19
1002 2021-12-17
1001 2021-12-20

        计算每个用户最大的连续登录天数,可以间隔一天。解释:如果一个用户在 1,3,5,6 登录游戏,则视为连续 6 天登录。

        按照分组的思想,间隔两天以内就划分为同一组,然后获取每组中的first_value和last_value ,然后日期相减取最大值即可。

with t1 as (
    select *,datediff(dt,lag(dt,1,null) over (partition by id order by dt )) cz from sql1_24
),t2 as (
    select id,dt,`if`(cz = null or cz >2 ,1,0)  status from t1
),t3 as (
    select id,dt,sum(status) over (partition by id order by dt) groupId from t2
),t4 as (
    select id,
       first_value(dt) over (partition by id,groupId order by dt) sdt,
       last_value(dt) over (partition by id,groupId order by dt)  edt
       from t3
)
select id,max(datediff(edt,sdt)+1) days from t4 group by id;

第25题:行列转换

create table sql1_25(
  a string,
  b string,
  c int
)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties(
  'input.regex'='(.+?)\\s+(.+?)\\s+(\\d+)',
    'output.format.string'='%1$s %2$s %3$s'
);
load data local inpath '/home/homedata/sql_1/sql1_25.txt' into table sql1_25;
select * from sql1_25;


2014    B       9
2015    A       8
2014    A       10
2015    B       7

第一题:行转列问题

将上面的数据转为下面这种格式

select a,
       sum(case b when "A" then c else 0 end) col_A,
       sum(case b when "B" then c else 0 end) col_B
       from sql1_25 group by a;

问题2:再转回去

create table sql1_25_2 as select a,
       sum(case b when 'A' then c else 0 end) col_A,
       sum(case b when 'B' then c else 0 end) col_B

from sql1_25 group by a ;
select a,'A' b ,col_A  c from sql1_25_2
union all
select a,'B' b ,col_B from sql1_25_2;

问题3:将上面的数据转为下面的这种

 

创建表格

create table sql1_25_3(
    year int,
    deptno string,
    score string
);
insert into sql1_25_3 values (2014,"B",9),
    (2015,"A",8),(2014,"A",10),(2015,"B",7),(2014,"B",6);

         两种写法思路是一样的,只是步骤换了一下,实际上就是一种解法不同写法

写法一:

with t1 as (
    select year a,case deptno when "A" then score else null end col_A,
       case deptno when "B" then score else null end col_B
from sql1_25_3
)
select a,concat_ws(",", collect_list(col_A)) col_A,
         concat_ws(",", collect_list(col_B)) col_B from t1 group by  a;

写法二:

with t1 as
    ( select year a ,deptno,concat_ws(',',collect_list(score)) tep1 from sql1_25_3 group by year,deptno )
select a,
       concat_ws(',',collect_list(case  deptno when 'A' then tep1  end ))col_A ,
       concat_ws(',',collect_list(case deptno when 'B' then tep1    end ))col_B
       from t1  group by a ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2230697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Linux命令行中使用GhatGPT

2、验明正身&#xff0c;证明我的所在地是国内 3、第一次提问 4、第二次提问 5、问他一首古诗 6、话不多说&#xff0c;现在来展示他的安装过程 7、输入GitHub的网址 https://github.com/aandrew-me/tgpt 8、详情页向下翻 9、到终端输入 下列命令&#xff0c;等待安装&#x…

2024年最新:阿里内部流传的大模型(LLM)面试真题

随着人工智能技术的迅猛发展&#xff0c;计算机视觉&#xff08;CV&#xff09;、自然语言处理&#xff08;NLP&#xff09;、搜索、推荐、广告推送和风险控制等领域的岗位越来越受欢迎&#xff0c;而_对于大型模型技术的掌握成为了这些岗位的标配_。 但目前公开的大模型资源还…

Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList

文章目录 一、Redis数据结构概述1.1 Redis有哪些数据类型1.2 Redis本质是哈希表1.3 Redis的哈希冲突与渐进式rehash1.4 数据结构底层1.4.1 简单动态字符串SDS1.4.2 双向链表&#xff08;后续已废弃&#xff09;1.4.3 压缩列表ZipList1.4.4 哈希表HashTable1.4.5 跳表SkipList1.…

【STM32】INA3221三通道电压电流采集模块,HAL库

一、简单介绍 芯片的datasheet地址&#xff1a; INA3221 三通道、高侧测量、分流和总线电压监视器&#xff0c;具有兼容 I2C 和 SMBUS 的接口 datasheet (Rev. B) 笔者所使用的INA3221是淘宝买的模块 原理图 模块的三个通道的电压都是一样&#xff0c;都是POWER。这个芯片采用…

C语言之写一个修改数组内容的函数

问题代码: 函数ltrim是为了消除buf字符数组中左边空格&#xff0c; memmove函数介绍 如果对c语言指针运用非常熟练的人,结合函数功能就会发现这个代码非常的傻逼&#xff0c;你会发现为什么需要返回&#xff0c;buf不用接收返回值&#xff0c;执行这个函数后buf中的内容就已经…

StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 目录 1.前言 2.线程池基础知识回顾 2.1.线程池的组成 2.2.工作流程 2…

解决pytorch问题:received an invalid combination of arguments - got

问题表现 今天跑模型时报了一个非常奇怪的错误&#xff1a; 意思是“你的lstm层输入的参数是无效的&#xff0c;要求接收参数的类型是(Tensor, tuple of (Tensor, Tensor), list of [Parameter, Parameter, Parameter, Parameter], float, int, float, bool, bool, bool)&am…

Springboot与easypoi(2):合并单元格、二级表头、动态导出

一、纵向合并单元格 使用Excel(needMerge true)标记的属性表示此单元格需要合并。ExcelCollection表示一对多的集合&#xff0c;下面是合并单元格案例。 实体类 企业类&#xff1a; package com.ywz.entity;import cn.afterturn.easypoi.excel.annotation.Excel; import cn.…

vue3 + ts + element-plus 二次封装 el-table

一、实现效果&#xff1a; &#xff08;1&#xff09;数据为空时&#xff1a; &#xff08;2&#xff09;有数据时&#xff1a;存在数据合并&#xff1b;可自定义表头和列的内容 &#xff08;3&#xff09;新增行&#xff1a; &#xff08;4&#xff09;删除行&#xff1a; &a…

Python CGI编程-cookie的设置、检索

设置检索 其他&#xff1a; 1. http.cookies和http.cookiejar区别&#xff1a; http.cookies主要用于创建和操作单个cookie对象&#xff0c;适用于需要精细控制单个cookie属性的场景。http.cookiejar则用于管理多个cookie&#xff0c;适用于需要自动处理多个请求和响应中的coo…

k8s 二进制部署安装(三)

目录 部署Calico Calico 工作原理 部署Calico 部署CoreDNS 负载均衡部署 部署dashboard 部署Calico 安装步骤来到 CNI 网络组件 &#xff0c;在&#xff08;二&#xff09;中我们安装了flannel&#xff0c;现在我们要尝试安装另一网络组件Calico calico 不使用隧道或NAT…

idea 创建web工程

模块添加Add Framework Support web Application 改为4.0以上

Linux系列-进程的概念

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 这篇文章&#xff0c;我们主要分析一下进程。 之前&#xff0c;我们讲过了冯诺依曼体系架构&#xff0c; 我们常见的计算机&#xff0c;像笔记本&#xff0c;或者不常见的计算机…

Rust的enum枚举的强大用法

在Rust中&#xff0c;enum&#xff08;枚举&#xff09;是一种非常强大的类型&#xff0c;它可以包含多个变体&#xff08;variants&#xff09;&#xff0c;每个变体可以是不同的类型&#xff0c;包括复杂类型。这使得enum在Rust中不仅用于表示简单的状态或选项集合&#xff0…

【初识Linux】

十点半的飞机快要到了&#xff0c;机场还是那么的拥挤.......................................................................... 文章目录 一、【初识指令】 1、 ls✔ 2、pwd✔ 3、cd✔ 4. touch✔ 5.mkdir✔ 6.rmdir✔ 7、rm ✔ 8.man✔ 9.cp✔ ​10、mv✔ 11、cat✔…

头歌——算法设计与分析(贪心法)

文章目录 第1关&#xff1a;贪心法代码 第2关&#xff1a;最小生成树代码 第3关&#xff1a;Huffman 编码代码 第4关&#xff1a;单源点最短路径代码 第1关&#xff1a;贪心法 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;贪心法 ;。 贪心法&#xff0c;又称…

面试题:JVM(四)

new对象流程&#xff1f;&#xff08;龙湖地产&#xff09; 对象创建方法&#xff0c;对象的内存分配。&#xff08;360安全&#xff09; 1. 对象实例化 创建对象的方式有几种&#xff1f; 创建对象的步骤 指针碰撞&#xff1a;以指针为分界线&#xff0c;一边是已连续使用的…

【进阶sql】复杂sql收集及解析【mysql】

开发时会出现&#xff0c;必须写一些较复杂sql的场景 可能是给会sql的客户 提供一些统计sql 或是临时需要统计数据信息但是 开发一个统计功能有来不及的情况 也可能是报表系统组件 只支持 sql统计的情况 特地记录下这些sql 作为积累 substring 截取查询出的字符串&#xff…

Python实现全国岗位招聘信息可视化分析(源码+论文+部署讲解)

项目源码&数据源获取 利用Python实现全国岗位招聘信息可视化分析 项目背景&#xff1a; 1.为企业招聘决策提供科学的依据和参考&#xff0c;可以帮助人力资源部门、招聘机构和求职者了解当前的就业形势、行业趋势和人才需求&#xff0c;从而做出更明智的招聘和求职决策。…

Python毕业设计选题:基于django+vue的宠物寄养平台的设计与实现

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 1. 前台系统功能模块 系统首页界面 用户注册界面 用户登录界面 宠物商城界面 宠物店…