DD3三元九运,九紫离火运-九紫运

#编程DD3三元九运,九紫离火运-九紫运

SQL语句的执行顺序是:DD3三元九运,九紫离火运-九紫运

from -> join -> on -> where -> group by -> select后面的普通字段,聚合函数countsum -> having -> distinct -> order by -> limitDD3三元九运,九紫离火运-九紫运

  • 行转列:
    DD3三元九运,九紫离火运-九紫运

例一:
DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

核心代码:行转列的常规做法是,group by+sum(if())【或count(if())】DD3三元九运,九紫离火运-九紫运

解答:DD3三元九运,九紫离火运-九紫运

select year,DD3三元九运,九紫离火运-九紫运

sum(if(month=1,amount,0)) as m1,DD3三元九运,九紫离火运-九紫运

sum(if(month=2,amount,0)) as m2,DD3三元九运,九紫离火运-九紫运

sum(if(month=3,amount,o)) as m3,DD3三元九运,九紫离火运-九紫运

sum(if(month=4,amount,0)) as m4DD3三元九运,九紫离火运-九紫运

from table2 group by year;DD3三元九运,九紫离火运-九紫运

注:if(month=1,amount,0) 即 case when month=1 then amount else 0 end; 
DD3三元九运,九紫离火运-九紫运

例二:DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

解答:DD3三元九运,九紫离火运-九紫运

select Ddate,DD3三元九运,九紫离火运-九紫运

count(case when shengfu='胜' then 1 else null end) as '胜',DD3三元九运,九紫离火运-九紫运

count(case when shengfu='' then 1 else null end) as '负'DD3三元九运,九紫离火运-九紫运

from table1DD3三元九运,九紫离火运-九紫运

group by ddate; DD3三元九运,九紫离火运-九紫运

例三:DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

解答:
DD3三元九运,九紫离火运-九紫运

select qq,DD3三元九运,九紫离火运-九紫运

concat_ws('_',collect_list(game)) as gameDD3三元九运,九紫离火运-九紫运

from tableaDD3三元九运,九紫离火运-九紫运

group by qq;DD3三元九运,九紫离火运-九紫运

反过来列转行解答:
DD3三元九运,九紫离火运-九紫运

select qq,DD3三元九运,九紫离火运-九紫运

tmp.gameDD3三元九运,九紫离火运-九紫运

from tableb lateral view explode(split(game,'_')) tmp as game;DD3三元九运,九紫离火运-九紫运

  • N日留存率:DD3三元九运,九紫离火运-九紫运

核心代码 :DD3三元九运,九紫离火运-九紫运

-> where日期 in(首日,1天后,7天后)DD3三元九运,九紫离火运-九紫运

-> group by用户DD3三元九运,九紫离火运-九紫运

->count(if(日期=首日,1,nu11)) as cntDD3三元九运,九紫离火运-九紫运

count(if(日期=1天后1nu1) as cnt2DD3三元九运,九紫离火运-九紫运

count(if(日期=7天后,1nu11))as cnt8DD3三元九运,九紫离火运-九紫运

->having cnt>0DD3三元九运,九紫离火运-九紫运

->count(user_id) as 首日总数DD3三元九运,九紫离火运-九紫运

count(if(cnt2>01nu11)) as 次日留存数DD3三元九运,九紫离火运-九紫运

count(if(cnt8>0,1nu11)) as 7日留存数DD3三元九运,九紫离火运-九紫运

->次日留存数/首日总数 as 次日留存率DD3三元九运,九紫离火运-九紫运

7日留存数/首日总数 as 7日留存率DD3三元九运,九紫离火运-九紫运

例一:DD3三元九运,九紫离火运-九紫运

select count(cuid) as uv_4_1,DD3三元九运,九紫离火运-九紫运

count(case when cnt_4_2>0 then 1 else null end) as uv_4_2.DD3三元九运,九紫离火运-九紫运

count(case when cnt_4_8>0 then 1 else nullend)as uv_4_8DD3三元九运,九紫离火运-九紫运

from(select cuid,DD3三元九运,九紫离火运-九紫运

count(case when event day='2020-04-01' then 1 else null end) as cnt_4_1DD3三元九运,九紫离火运-九紫运

count(case when event day=2020-04-02’ then 1 else null end) as cnt_4_2DD3三元九运,九紫离火运-九紫运

count(case when event day=2020-04-08’ then 1 else nullend) as cnt 4 8DD3三元九运,九紫离火运-九紫运

from tb_cuid_1d where event_day in (2020-04-01,2020-04-02',12020-04-08')DD3三元九运,九紫离火运-九紫运

group by cuidDD3三元九运,九紫离火运-九紫运

having cnt_4_1>0) as tDD3三元九运,九紫离火运-九紫运

结果:
DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

--提前过滤数据DD3三元九运,九紫离火运-九紫运

where eventday in('2020-04-01'2020-04-02'2020-04-08')DD3三元九运,九紫离火运-九紫运

group by cuid;DD3三元九运,九紫离火运-九紫运

  • 分组内TOP前几:DD3三元九运,九紫离火运-九紫运

需求常见词:每组xxx的第一个】【每组xxx的最后一个】【每组xxx的前n个】【每组最xx的前个】DD3三元九运,九紫离火运-九紫运

公式:row_number()over(partition by 组名) as rn,再筛选rn<=N名DD3三元九运,九紫离火运-九紫运

核心代码:DD3三元九运,九紫离火运-九紫运

select * fromDD3三元九运,九紫离火运-九紫运

(select zzz,DD3三元九运,九紫离火运-九紫运

row_number() over(partition by 组名xxx order by yyy) as rnDD3三元九运,九紫离火运-九紫运

from table) as tDD3三元九运,九紫离火运-九紫运

where rn<=N名DD3三元九运,九紫离火运-九紫运

  • 连续N天登录:DD3三元九运,九紫离火运-九紫运

例一:DD3三元九运,九紫离火运-九紫运


DD3三元九运,九紫离火运-九紫运

解答:DD3三元九运,九紫离火运-九紫运

with t1 as (select distinct name ,'date’ from game),DD3三元九运,九紫离火运-九紫运

t2 as (select *,DD3三元九运,九紫离火运-九紫运

row_number() over (partition by name order by 'date`) as rnDD3三元九运,九紫离火运-九紫运

from t1),DD3三元九运,九紫离火运-九紫运

t3 as (select name,date_sub(`date',rn) as temp,count(1) as cnt DD3三元九运,九紫离火运-九紫运

from t2 DD3三元九运,九紫离火运-九紫运

group by name,temp DD3三元九运,九紫离火运-九紫运

having count(1)>=3)DD3三元九运,九紫离火运-九紫运

select distinct nane from t3DD3三元九运,九紫离火运-九紫运

例二:
DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

解答:DD3三元九运,九紫离火运-九紫运

with t1 as(select distinct name,dt from game),DD3三元九运,九紫离火运-九紫运

t2 as(select *,DD3三元九运,九紫离火运-九紫运

date_add(dt,2)as date2,DD3三元九运,九紫离火运-九紫运

lead(dt,2)over(partition by name order by dt)as date3
DD3三元九运,九紫离火运-九紫运

from t1)
DD3三元九运,九紫离火运-九紫运

select distinct name from t2 where date2=date3;
DD3三元九运,九紫离火运-九紫运

以上SQL的核心代码:DD3三元九运,九紫离火运-九紫运

->distinctDD3三元九运,九紫离火运-九紫运

->date_add(dt,N-1) as date2DD3三元九运,九紫离火运-九紫运

->lead(dt,N-1) over(partition by userid order by dt) as date3DD3三元九运,九紫离火运-九紫运

->where date2=date3DD3三元九运,九紫离火运-九紫运

->distinctDD3三元九运,九紫离火运-九紫运

  • 窗口函数:
    DD3三元九运,九紫离火运-九紫运

特点:窗口函数最重要的特点是有OVER关键字,它代表定义窗口。DD3三元九运,九紫离火运-九紫运

语法:窗口函数(字段名) over(partition by 分组字段 order by 排序字段) DD3三元九运,九紫离火运-九紫运

注:order by 为不必要字段,不需要排序可不写。      DD3三元九运,九紫离火运-九紫运

常用函数分类:DD3三元九运,九紫离火运-九紫运

聚合类的窗口函数: sum() over() 添加 order by 会计算累加,不加则为求和。DD3三元九运,九紫离火运-九紫运

例句:DD3三元九运,九紫离火运-九紫运

select *,DD3三元九运,九紫离火运-九紫运

sum(score) over(partition by cid) as ’班级总分‘DD3三元九运,九紫离火运-九紫运

sum(score) over (partition by cid order by score) as 累加分数1‘
DD3三元九运,九紫离火运-九紫运

sum(score) over (partition by cid order by score rows between unbounded preceding and current row) as ‘累加分数2’ DD3三元九运,九紫离火运-九紫运

from scoreDD3三元九运,九紫离火运-九紫运

结果:DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

2. count/avg/max/minDD3三元九运,九紫离火运-九紫运

排序类的窗口函数row_number, rank,dense_rankDD3三元九运,九紫离火运-九紫运

例句:DD3三元九运,九紫离火运-九紫运

select *,DD3三元九运,九紫离火运-九紫运

--同一个班内,按分数排序打上序号DD3三元九运,九紫离火运-九紫运

row_number(over (partition by cid order byscore) as '分数序号排名`DD3三元九运,九紫离火运-九紫运

--考虑并列DD3三元九运,九紫离火运-九紫运

rank() over (partition by cid order by score) as '分数序号排名2`DD3三元九运,九紫离火运-九紫运

dense_rank()over(partition by cid order by score) as '分数序号排名3'DD3三元九运,九紫离火运-九紫运

from score;DD3三元九运,九紫离火运-九紫运

结果: DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

偏移类的,跨行的:lag/leadDD3三元九运,九紫离火运-九紫运

例句一:DD3三元九运,九紫离火运-九紫运

select *,DD3三元九运,九紫离火运-九紫运

--同一班内,考得比自己低1名的分数是多少
DD3三元九运,九紫离火运-九紫运

lag(score,1,默认值)over(partition by cid order by score) as '低一名的分数',DD3三元九运,九紫离火运-九紫运

--同一班内,考得比自己低2名的分数是多少DD3三元九运,九紫离火运-九紫运

lag(score,2)over(partition by cid order by score) as '低2名的分数‘DD3三元九运,九紫离火运-九紫运

from score;DD3三元九运,九紫离火运-九紫运

结果:DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

例句二:DD3三元九运,九紫离火运-九紫运

select *,DD3三元九运,九紫离火运-九紫运

lead(score,1)over(partition by cid order by score) as '高一名的分数'DD3三元九运,九紫离火运-九紫运

from score;DD3三元九运,九紫离火运-九紫运

结果:DD3三元九运,九紫离火运-九紫运


DD3三元九运,九紫离火运-九紫运

【仅了解,不常用】first_value / last_valueDD3三元九运,九紫离火运-九紫运

【仅了解,几乎不用】ntile / nthDD3三元九运,九紫离火运-九紫运

实际案例:DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

with t1 asDD3三元九运,九紫离火运-九紫运

--计算同一个人的分数总和DD3三元九运,九紫离火运-九紫运

(select name,sum(amt) as sum_amt from emp group by name),DD3三元九运,九紫离火运-九紫运

--排名及计算总分DD3三元九运,九紫离火运-九紫运

t2 as (select *,DD3三元九运,九紫离火运-九紫运

row_number()over(partition by null order by sum_amt desc)as rn,sum(sum_amt) over(partition bynull) as sum_all  --全体总分DD3三元九运,九紫离火运-九紫运

from t1)DD3三元九运,九紫离火运-九紫运

select *,round(sum_amt*100/sum_all 2) || '%as rate  --DD3三元九运,九紫离火运-九紫运

--|| 两根竖线等价于concat函数DD3三元九运,九紫离火运-九紫运

from t2;
DD3三元九运,九紫离火运-九紫运

结果:DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

DD3三元九运,九紫离火运-九紫运

声明:有的资源均来自网络转载,版权归原作者所有,如有侵犯到您的权益 请联系邮箱:123456@qq.com 我们将配合处理!

原文地址:SQL面试常见题及核心代码示例发布于2024-04-01 12:02:07