首页 > 数据库 >sql练习专场(一)(6-10)

sql练习专场(一)(6-10)

时间:2024-11-03 12:15:39浏览次数:3  
标签:10 01 专场 sql1 2021 sql dt id user

第六题:统计每个成绩段人数

create table sql1_6(
    str string
);
load data local inpath '/home/homedata/sql_1/sql1_6.txt' into table sql1_6;
{"username":"张三","score":95}
{"username":"李四","score":76}
{"username":"赵本山","score":92}
{"username":"王五","score":76}
{"username":"赵六","score":62}
{"username":"赵六1","score":62}
{"username":"赵六2","score":26}
{"username":"赵六3","score":89}
{"username":"赵六4","score":77}

        主要是函数get_json_object的使用

with t1 as (
    select case when get_json_object(str,'$.score') >90 then '优'
            when get_json_object(str,'$.score') >80 then '良'
            when get_json_object(str,'$.score') >60 then '中'
            else '差' end grade
        from sql1_6
)
select grade,count(*) from t1 group by grade;

题目七:支付次数和累计充值金额统计

create table sql1_7(
  user_id     string,
  date_dt     string,
  trans_type  string,
  trans_amt   double,
  trans_dc    string
)row format delimited fields terminated by ',';
 
load data local inpath '/home/homedata/sql_1/sql1_7.txt' into table sql1_7;
 
u_001,20191201,支付,20000,支
u_001,20191203,充值,30010,收
u_001,20191203,提现,50000,支
u_001,20191208,支付,20000,支
u_001,20191210,充值,30010,收
u_001,20191220,提现,50000,支
u_002,20191202,支付,20000,支
u_002,20191202,转入,30010,收
u_002,20191230,充值,50000,收
u_003,20200110,支付,60.68,支
u_004,20200111,支付,90.05,支
u_004,20200114,充值,100.1,收
u_005,20200101,还款,30010,支

        求每个月用户的支付次数(trans_dc为支的数据)大于3次,且每月累计充值金额大于10000元的用户交易记录。

with t1 as (
    select user_id,substr(date_dt,1,6) dt,trans_dc ,count(*) count from sql1_7 group by user_id,trans_dc,substr(date_dt,1,6)
),
    t2 as (
    select user_id,dt from t1 where count >3 and trans_dc ='支'
),
    t3 as (
    select t2.user_id user_id,dt,trans_amt from t2 left join sql1_7 on t2.user_id = sql1_7.user_id and dt = substr(date_dt,1,6) and trans_type = '充值'
)
select user_id,dt from t3 group by user_id,dt having sum(trans_amt) >10000;

题目八:对于订单数据统计

create table sql1_8
(
  order_id     string,         --订单id
  user_id      string,         --用户id
  user_name    string,         --用户姓名
  order_date   string,         --下单日期
  order_amount  int            --订单金额
);
insert overwrite table sql1_8
values('1','1001','小元','2022-01-01','10'),
('2','1002','小海','2022-01-02','15'),
('3','1001','小元','2022-02-03','23'),
('4','1002','小海','2022-01-04','29'),
('5','1001','小元','2022-01-05','46'),
('6','1001','小元','2022-04-06','42'),
('7','1002','小海','2022-01-07','50'),
('8','1001','小元','2022-01-08','50'),
('9','1003','小辉','2022-04-08','62'),
('10','1003','小辉','2022-04-09','62'),
('11','1004','小猛','2022-05-10','12'),
('12','1003','小辉','2022-04-11','75'),
('13','1004','小猛','2022-06-12','80'),
('14','1003','小辉','2022-04-13','94');
select * from sql1_8;
-- 1.统计每个用户截至每次下单的累积下单总额
 
select *,sum(order_amount) over (partition by user_id order by order_date) sumMoney  from sql1_8;
 
 
-- 2.统计每个用户截至每次下单的当月累积下单总额
select *,
       sum(order_amount) over (partition by user_id ,month(order_date) order by order_date )
from sql1_8;
 
-- 3.统计每个用户每次下单距离上次下单相隔的天数(首次下单按0天算)
select *,datediff(order_date,lag(order_date,1,order_date)  over (partition by user_id order by order_date )) days from sql1_8;
 
-- 4.为每个用户的所有下单记录按照订单金额进行排名
 
select *,dense_rank() over (partition by user_id order by order_amount desc ) num from sql1_8;

题目九:网站登录时间间隔统计

create table sql1_9 (
    user_id string,
    dt string
);
 
INSERT INTO
sql1_9(user_id,dt)
VALUEs('a001','2021-01-01')
,('b001','2021-01-01')
,('a001','2021-01-03')
,('a001','2021-01-06')
,('a001','2021-01-07')
,('b001','2021-01-07')
,('a001','2021-01-08')
,('a001','2021-01-09')
,('b001','2021-01-09')
,('b001','2021-01-10')
,('b001','2021-01-15')
,('a001','2021-01-16')
,('a001','2021-01-18')
,('a001','2021-01-19')
,('b001','2021-01-20')
,('a001','2021-01-23');
select * from sql1_9;

        计算每个用户登录日期间隔小于5天的次数。——主要是lag函数的使用,只需要计算这次和上次登录的时间差,然后汇总即可。

with  t1 as (
    select *,datediff(dt,lag(dt,1,dt) over (partition by user_id order by dt ) )-1 as days from sql1_9
)select user_id,count(*) count from t1 where  days <5 and days !=-1 group by user_id;

题目十:蚂蚁森林,连续问题

create table sql1_10(
    id int,
    dt string,
    num int
)
row format delimited
fields terminated by ' ';
 
load data local inpath '/home/homedata/sql_1/sql1_10.txt' into table sql1_10;
 
id     dt       lowcarbon
1001 2021-12-12 123
1002 2021-12-12 45
1001 2021-12-13 43
1001 2021-12-13 45
1001 2021-12-13 23
1002 2021-12-14 45
1001 2021-12-14 230
1002 2021-12-15 45
1001 2021-12-15 23

        找出连续 3 天及以上总共减少碳排放量在 100 以上的,这个题同样是连续问题,只需要通过row_number进行排序,然后使用日期减去这个排名,日期相同的即为同一组,进行汇总即可。

with t1 as (
    select id,dt,sum(num) sum,row_number() over (partition by id order by dt) num from sql1_10 group by id ,dt
)select id from t1 group by id,date_sub(dt,num) having sum(sum) > 100 and count(*) >= 3;

标签:10,01,专场,sql1,2021,sql,dt,id,user
From: https://blog.csdn.net/weixin_52642840/article/details/143455127

相关文章

  • 缓存雪崩/穿透/击穿/失效原理图/14种缓存数据特征+10种数据一致性方案(全面篇)
    在当今数据驱动的互联网时代,缓存成为了提升应用性能的关键技术。面对海量用户请求,如何通过缓存策略有效减轻数据库压力、降低响应延迟?本文深入探讨了缓存雪崩、缓存穿透、缓存击穿等常见问题,并提供了全面的解决方案。通过实际案例分析,揭示了缓存设计的最佳实践,确保数据一致......
  • SQL注入绕过
    WAF介绍一、WAF介绍WAF(WebApplicationFirewall,Web应用防火墙)及与其相关的知识,这里利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为web应用提供保护的一款产品。WAF基本上可以分为以下几类:1.1软件型WAF以软件形式装在所保护的服务......
  • 【Mysql进阶】5步轻松掌握MySQL日志查询,你真的懂了吗?
    ......
  • the sad young men 10-31
      Certainly,herearetheanswersinEnglish,简洁地回答每个问题:1.**Whyweretheyoungergenerationofthe1920sthoughttobewild?**-Theyoungergenerationwasthoughttobewildduetotheirrebellionagainsttraditionalvaluesandtheirpur......
  • [免费]SpringBoot+Vue智慧校园(校园管理)系统[论文+源码+SQL脚本]
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot++Vue智慧校园(校园管理)系统,分享下哈。项目视频演示【免费】SpringBoot+Vue智慧校园(校园管理)系统Java毕业设计_哔哩哔哩_bilibili项目介绍随着信息技术的迅猛发展,智慧校园建设逐渐成为高校发展的重要趋势。本文旨......
  • [极客大挑战 2019]BabySQL
    题目链接:https://buuoj.cn/challenges#[极客大挑战2019]BabySQL打开环境后如下所示。尝试以下几种方法的万能密码:不加单引号。加单引号。加双引号。发现加入了单引号后,有SQL错误提示,但是可以发现,题目似乎过滤了用户输入的"or"。接下来,尝试双写绕过。发现可以成......
  • [SUCTF 2019]EasySQL
    题目链接:https://buuoj.cn/challenges#[SUCTF2019]EasySQL打开环境后,如下所示。尝试输入字符:1。尝试输入字符:0后,发现没有输出结果。尝试输入字符串"aaa"、"bbb"等后,发现都跟输入0的结果一致,而输入123、456等非0的内容,都与输入1一致,这里可以猜测(实际上需要比较......
  • [极客大挑战 2019]LoveSQL
    题目链接:https://buuoj.cn/challenges#[极客大挑战2019]LoveSQL。打开环境后,如下所示。尝试SQL注入(万能密码)。Payload:admin'+or+1%3d1%3b%23。(笔者通过简单粗暴的尝试:①没有使用单引号;②使用单引号;③使用双引号,来确定后端拼接的SQL语句中的password参数系使用单引号......
  • php毕业设计基于PHP的电子购物商城在线购物系统商城网站电子产品商城php+mysql+html计
    一、功能介绍php在线购物商城电商网站详细技术:HTML+CSS+JS+PHP+MYSQL系统分为用户和管理员两种身份用户功能如下:1.登陆注册2.查看商品详情、蛋糕资讯3.加入购物车、结算订单4.评价5.修改密码6.搜索蛋糕7.退出登录管理员功能如下:1.登录退出2.蛋糕管理(添加、修改和......
  • 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现六
    一、前言介绍:1.1项目摘要随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势。传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速、便捷需求。这些问题不仅影响了快递服务的效率,也增加了快递员和消费者的不便。在这样的背景下,快递柜......