当前位置:网站首页>牛客的课程订单分析[分组统计时如何取指定行字段?]
牛客的课程订单分析[分组统计时如何取指定行字段?]
2022-08-02 15:48:00 【REN_林森】
分组统计时如何取指定行字段?
前言
对于group by时,select只能出现分组字段和聚集函数的结果,如何拿到其中任意一条记录的字段呐?可以配合SQL的语法,在外层套一个聚集函数在内if限定记录即可。
一、牛客的课程订单分析
二、窗口函数 & 聚集函数配if
1、窗口min() & lead()
with view4base as(
select
user_id,`date`,
min(`date`) over(partition by user_id) first_buy_date,
lead(`date`,1) over(partition by user_id order by `date`) second_buy_date,
count(1) over(partition by user_id) cnt
from order_info
where `date` > '2025-10-15'
and product_name in('C++','Java','Python')
and `status` = 'completed'
)
select user_id,first_buy_date,second_buy_date,cnt
from view4base
where cnt > 1 and `date` = first_buy_date
order by user_id
2、窗口min()+max(if())
/* view中如果只拿第一次的日期该如何解决? 如何拿第2日期呐? max() 配if + null,配合SQL语法,用max()也能拿到第二日期放在同一行。 */
with view4base as(
select
user_id,`date`,
min(`date`) over(partition by user_id) first_buy_date
from order_info
where `date` > '2025-10-15'
and product_name in('C++','Java','Python')
and `status` = 'completed'
)
select
user_id,first_buy_date,
min(if(`date` = first_buy_date,null,`date`)) second_buy_date,
count(1) cnt
from view4base
group by user_id,first_buy_date
having count(1) > 1
order by user_id
3、窗口rank()+max(if())
# 如果要第三第四等等,可以这种if比较繁琐,可max() + if + rank()让max只从一条记录中筛选。
with view4base as(
select
user_id,`date`,
rank() over(partition by user_id order by `date`) rk
from order_info
where `date` > '2025-10-15'
and product_name in('C++','Java','Python')
and `status` = 'completed'
)
select
user_id,min(`date`) first_buy_date,
min(if(rk = 2,`date`,null)) second_buy_date,
count(1) cnt
from view4base
group by user_id
having count(1) > 1
order by user_id
总结
1)想把SQL玩的6,就必须有抽象的能力,我重来没想过在聚集函数里加if,甚至对字段做运算,甚至多字段,其实这都是可以的,把聚集函数内层当一个集合,而给什么集合自己可以随意。
2)举一反三,那么窗口函数得到的排名值等各种值,其实也可以拿来当成运算,而不需要等到外层view。
参考文献
[1] 牛客SQL篇
边栏推荐
猜你喜欢
随机推荐
Break the stereotype, DIY is your own unique mall
tiup mirror rotate
06-线程池(3大方法、7大参数,4种拒绝策略)
数仓:金融级数仓架构转型的最佳实践(下篇)
MongoDB 《三》复制集集群搭建实例
SIGIR'22 推荐系统论文之序列推荐(短文)篇
JZ11 旋转数组的最小数字
【面经】被虐了之后,我翻烂了equals源码,总结如下
VLAN实验
AI+BI+可视化,Sugar BI架构深度剖析
Go-4-在vim中无法跳转到源代码
【学术相关】北大一研究生偷取同门师妹论文发表,作者却挂名给了武大 3 位不知情的学生......
JZ27 二叉树的镜像
ACL/NAACL'22 推荐系统论文梳理
跨境电商看不到另一面:商家刷单、平台封号、黑灰产牟利
tiup mirror set
(LinkedList与链表) 和 (ArrayList与顺序表)的区别
想要白嫖正则是吧?这一次给你个够!
JZ4 二维数组中的查找
助力疫情防控,30行代码就能搞定无服务器实时健康码识别!