SQL(1/14)

牛客每天有很多人登录,请你统计一下牛客每个日期新用户的次日留存率

牛客每天有很多人登录,请你统计一下牛客每个日期新用户的次日留存率。

-- 联立两表
-- 每个日期新用户的次日留存数/每个日期登录新用户的个数 即为每个日期新用户留存率
	SELECT one.date,IFNULL(ROUND(two.counts/one.sum,3),0) p FROM
	(
        #每个日期新用户的次日留存数
		SELECT l.date,IFNULL(t.sum,0) sum
		FROM login l
		LEFT JOIN(
			SELECT date,COUNT(user_id) sum
			FROM login l1
			WHERE user_id NOT IN(
				SELECT user_id from login l2
				WHERE l2.date < l1.date
			)
			GROUP BY date
		) t
		ON l.date = t.date
		GROUP BY l.date
		ORDER BY l.date
	)AS one
	JOIN
	(
		#每个日期登录新用户的个数
        SELECT DISTINCT l.date,IFNULL(t.sum,0) counts
		FROM login l
		LEFT JOIN(
			SELECT DATE_SUB(date,INTERVAL 1 DAY) date,count(user_id) sum
			FROM login
			WHERE (user_id,date) in (
				SELECT user_id,DATE_ADD(MIN(date),INTERVAL 1 DAY) date
				FROM login	
				GROUP BY user_id
			)
			GROUP BY date
		)t
		ON l.date = t.date
		ORDER BY l.date
	)two
	ON one.date = two.date
    ORDER BY one.date

牛客每天有很多人登录,请你统计一下牛客每个用户查询刷题信息

牛客每天有很多人登录,请你统计一下牛客每个用户查询刷题信息,包括: 用户的名字,以及截止到某天,累计总共通过了多少题。 不存在没有登录却刷题的情况,但是存在登录了没刷题的情况,不会存在刷题表里面,有提交代码没有通过的情况,但是会记录在刷题表里,只不过通过数目是0。

select name u_n,date,sum(number) over (partition by user_id order by date) ps_num
from passing_number p
inner join user
on user.id=p.user_id
group by date,u_n
order by date,name;
# 使用窗口函数SUM,将日期作为“窗口”计算累加刷题数量

请你写一个sql语句查询各个岗位分数的平均数,并且按照分数降序排序,结果保留小数点后面3位(3位之后四舍五入)

请你写一个sql语句查询各个岗位分数的平均数,并且按照分数降序排序,结果保留小数点后面3位(3位之后四舍五入)

select job,round(avg(score),3) avg
from grade
group by job
order by avg desc;

请你写一个sql语句查询用户分数大于其所在工作(job)分数的平均分的所有grade的属性,并且以id的升序排序

请你写一个sql语句查询用户分数大于其所在工作(job)分数的平均分的所有grade的属性,并且以id的升序排序

select g1.*
from grade g1
where score > (select avg(score)
              from grade g2
              where g2.job=g1.job
              group by job )
order by g1.id;

请你找出每个岗位分数排名前2的用户,得到的结果先按照language的name升序排序,再按照积分降序排序,最后按照grade的id升序排序

请你找出每个岗位分数排名前2的用户,得到的结果先按照language的name升序排序,再按照积分降序排序,最后按照grade的id升序排序

select id,name,score
from (select g.id,l.name,g.score
      ,dense_rank()over(partition by g.language_id order by score desc) rn
      from grade g
      inner join language l on g.language_id=l.id) t
where rn<=2
order by name,score desc,id;

请你写一个sql语句查询各个岗位分数升序排列之后的中位数位置的范围,并且按job升序排序

请你写一个sql语句查询各个岗位分数升序排列之后的中位数位置的范围,并且按job升序排序

select job,floor((count(job)+1)/2) sta,ceiling((count(job)+1)/2) en
from grade
group by job;

请你写一个sql语句查询各个岗位分数的中位数位置上的所有grade信息,并且按id升序排序

请你写一个sql语句查询各个岗位分数的中位数位置上的所有grade信息,并且按id升序排序

select id,job,score,r
from(select *,rank()over(partition by job order by score desc)r,
              count(*)over(partition by job) t
     from grade) A
where round(abs(r-(t+1)/2)*1.0,2)<1
order by id;
select id,job,score,r
from(select *,rank()over(partition by job order by score desc)r,
              count(*)over(partition by job) t
     from grade) A
where round(abs(r-(t+1)/2)*1.0,2)<1
order by id;
# select t.id,t.job,t.score,t.ranking as `rank`
# from
# (select id,job,score,
#     row_number() over(partition by job order by score desc) as ranking
# from grade) as t
# left join 
# (select job,count(score) as total
# from grade
# group by job) as s
# on t.job =s.job
# where (total DIV 2 +1 =ranking) or 
# ((mod(total,2)=0) and (ranking=total DIV 2))
# order by t.id


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值