SQL面试题:类递归计算

简介: 最近遇到一个比较有意思的SQL题,看似需要使用递归计算,其实不然,可以使用窗口函数解决

题目:有表t,数据如下

date_month

avg_views

2022-01

3621

2022-02

3786

2022-03

2685

2022-04

2433

2022-05

2241

2022-06

2756

2022-07

3589

2022-08

4215

2022-09

5894

需要计算:截止到当月,前月距离当月月数*签约views数累计之和,结果如下

date_month

avg_views

res

2022-01

3621

3621*1

2022-02

3786

3786*1+3621*2

2022-03

2685

2685*1+3786*2+3621*3

2022-04

2433

2433*1+2685*2+3786*3+3621*4

2022-05

2241

2241*1+2433*2+2685*3+3786*4+3621*5

2022-06

2756

2756*1+2241*2+2433*3+2685*4+3786*5+3621*6

2022-07

3589

3589*1+2756*2+2241*3+2433*4+2685*5+3786*6+3621*7

2022-08

4215

4215*1+3589*2+2756*3+2241*4+2433*5+2685*6+3786*7+3621*8

2022-09

5894

5894*1+4215*2+3589*3+2756*4+2241*5+2433*6+2685*7+3786*8+3621*9

看着有点像乘法口诀表哈,在这里做一下题目需求的解释:

1.截止到2022-01月:只有3621,距离本月为1个月,即3621*1;

2.截止到2022-02月:1月距离本月为2个月,即1月的36213621*2,2月距离本月为1,即3786,求和为3621*2+3786;

以此类推计算截止到每个月的前月累计。


我们只看1月的数值在res列均出现了,相当于直接sum的,这里就可以想到使用sum over开窗函数累加数据

select  date_month,  avg_views,  sum(avg_views) over(orderby date_month) res1
from t

得到的结果如下

date_month

avg_views

res1

2022-01

3621

3621*1

2022-02

3786

3786*1+3621*1

2022-03

2685

2685*1+3786*1+3621*1

2022-04

2433

2433*1+2685*1+3786*1+3621*1

2022-05

2241

2241*1+2433*1+2685*1+3786*1+3621*1

2022-06

2756

2756*1+2241*1+2433*1+2685*1+3786*1+3621*1

2022-07

3589

3589*1+2756*1+2241*1+2433*1+2685*1+3786*1+3621*1

2022-08

4215

4215*1+3589*1+2756*1+2241*1+2433*1+2685*1+3786*1+3621*1

2022-09

5894

5894*1+4215*1+3589*1+2756*1+2241*1+2433*1+2685*1+3786*1+3621*1

但这个结果好像和预期不一样,如果把res1结果在累加一次,应该会达到预期效果

select  date_month,  avg_views,  sum(res1) over(orderby date_month) res
from(select    date_month,    avg_views,    sum(avg_views) over(orderby date_month) res1
from t
) tmp

得到的结果如下,达到了预期效果,其实好像和递归也没啥关系,不知题意为何归为递归

date_month

avg_views

res

2022-01

3621

3621*1

2022-02

3786

3786*1+3621*2

2022-03

2685

2685*1+3786*2+3621*3

2022-04

2433

2433*1+2685*2+3786*3+3621*4

2022-05

2241

2241*1+2433*2+2685*3+3786*4+3621*5

2022-06

2756

2756*1+2241*2+2433*3+2685*4+3786*5+3621*6

2022-07

3589

3589*1+2756*2+2241*3+2433*4+2685*5+3786*6+3621*7

2022-08

4215

4215*1+3589*2+2756*3+2241*4+2433*5+2685*6+3786*7+3621*8

2022-09

5894

5894*1+4215*2+3589*3+2756*4+2241*5+2433*6+2685*7+3786*8+3621*9

今日解析SQL到此为止

拜了个拜

目录
相关文章
|
5天前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
10 0
|
5天前
|
安全 Java 开发者
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
Java面试题:什么是Java 15中的密封类以及其限制?还有哪些其他特性用于限制类继承的机制吗?
12 1
|
5天前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
14 1
|
19天前
|
SQL 大数据
常见大数据面试SQL-每年总成绩都有所提升的学生
一张学生成绩表(student_scores),有year-学年,subject-课程,student-学生,score-分数这四个字段,请完成如下问题: 问题1:每年每门学科排名第一的学生 问题2:每年总成绩都有所提升的学生
|
22天前
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之odps sql 底层计算框架是MR吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
24天前
|
SQL 关系型数据库 MySQL
sql面试题库
sql面试题库
|
5天前
|
存储 运维 前端开发
Java面试题:什么是Java的异常处理机制?列举常见的异常类,并说明使用场景
Java面试题:什么是Java的异常处理机制?列举常见的异常类,并说明使用场景
15 0
|
5天前
|
安全 Java 数据处理
Java面试题:什么是Java中的Optional类及其使用场景?
Java面试题:什么是Java中的Optional类及其使用场景?
8 0
|
5天前
|
前端开发 Java 编译器
Java面试题:描述Java类的加载过程,包括加载、链接、初始化等阶段。
Java面试题:描述Java类的加载过程,包括加载、链接、初始化等阶段。
8 0
|
5天前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
14 0