当前位置:网站首页>牛客的课程订单分析[分组统计时如何取指定行字段?]
牛客的课程订单分析[分组统计时如何取指定行字段?]
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篇
边栏推荐
猜你喜欢

AI+BI+可视化,Sugar BI架构深度剖析

跨境电商看不到另一面:商家刷单、平台封号、黑灰产牟利

【服务器数据恢复】Raid阵列更换故障硬盘后数据同步失败的数据恢复案例

面试官:可以谈谈乐观锁和悲观锁吗

最强分布式锁工具:Redisson

先睹为快!界面控件DevExpress WPF这些功能即将发布

20 Lectures on Disassembly of Multi-merchant Mall System Functions-Platform Distribution Overview

2022 年值得尝试的 7 个 MQTT 客户端工具

【面经】被虐了之后,我翻烂了equals源码,总结如下

Mysql 查询语句中where字段= '' 作用是什么 ?如何实现多条件查询
随机推荐
跨境电商看不到另一面:商家刷单、平台封号、黑灰产牟利
redis学习四redis消息订阅、pipeline、事务、modules、布隆过滤器、缓存LRU
WWW'22 推荐系统论文之图神经网络篇
不平衡问题: 深度神经网络训练之殇
数据防泄漏产品该如何选择
11.2-HJ86 求最大连续bit数
Qt | 文件操作 QFile
Go-4-在vim中无法跳转到源代码
一文搞懂│php 中的 DI 依赖注入
JZ21 调整数组顺序使奇数位于偶数前面(一)-相对位置变化
美团面试:如何设计一个注册中心?
互联网刚需岗位 前景一片大好?
MPLS实验
Break the stereotype, DIY is your own unique mall
tiup mirror sign
Qt | 关于样式表的使用 QStyleSheet
技术分享| 融合调度系统中的电子围栏功能说明
2.3 - P、V、S机制
2.5 - 死锁
提高测试覆盖率的四大步骤