当前位置:网站首页>牛客的课程订单分析[分组统计时如何取指定行字段?]
牛客的课程订单分析[分组统计时如何取指定行字段?]
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篇
边栏推荐
猜你喜欢
随机推荐
tiup mirror sign
JZ32 从上往下打印二叉树
坚持自主创新 线控底盘领军企业英创汇智获数亿元B+轮融资
WWW'22 推荐系统论文之多任务与对比学习篇
想要白嫖正则是吧?这一次给你个够!
机械臂速成小指南(十七):直线规划
一文搞懂│php 中的 DI 依赖注入
怒写400篇AI文章!这群妹子卷疯了…
2022年值得尝试的7个MQTT客户端工具
【面经】被虐了之后,我翻烂了equals源码,总结如下
【[SCOI2005] 互不侵犯】【状压DP(含概念讲解)】
Qt | 文件操作 QFile
CefSharp practical demonstration
redis学习四redis消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
策略路由下发
NC231 只出现一次的数字
Advanced usage of vim configuration
let块级作用域,var变量提升
2022 年值得尝试的 7 个 MQTT 客户端工具
【Codeforces Round #811 (Div. 3)】【题目解析+AK代码】