SQL经典问题:最后一个能进电梯的人

目录

0 题目

1 数据准备 

2 问题分析

3 小结

想要进一步了解SQL这门艺术语言的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。

数字化建设通关指南

(1)SQL进阶实战技巧

(2)数仓建模实战技巧和个人心得      


0 题目

有表: elevator

+-------------+---------+

| Column Name | Type    |

+-------------+---------+

| person_id   | int     |

| person_name | varchar |

| weight      | int     |

| turn        | int     |

+-------------+---------+

person_id 是这个表具有唯一值的列。

该表展示了所有等候电梯乘客的信息。

表中 person_id 和 turn列将包含从 1 到 n 的所有数字,其中 n 是表中的行数。

turn 决定了等候电梯乘客上电梯的顺序,其中 turn=1 表示第一个上电梯,turn=n 表示最后一个上电梯。

weight 表示候电梯乘客的体重,以千克为单位。

有一队乘客在等着上电梯。然而,电梯有1000  千克 的重量限制,所以其中一部分乘客可能无法上电梯。

编写解决方案找出 最后一个 上电梯且不超过重量限制的乘客,并报告 person_name 。题目测试用例确保顺位第一的人可以上电梯且不会超重。

返回结果格式如下所示。

示例 1:

输入:

Elevator表

+-----------+-------------+--------+------+

| per_id   | per_name      | weight | turn |

+-----------+-------------+--------+------+

| 5        | Alice         | 250    | 1   |

| 4        | Bob           | 175    | 5   |

| 3        | Alex          | 350    | 2   |

| 6        | John Cena     | 400    | 3   |

| 1        | Winston       | 500    | 6   |

| 2        | Marie         | 200    | 4   |

+-----------+-------------+--------+------+

输出:

+-------------+

| person_name |

+-------------+

| John Cena   |

+-------------+

1 数据准备 

create table elevator as (select stack(
                                         6,
                                         5, 'Alice', 250, 1,
                                         4, 'Bob', 175, 5,
                                         3, 'Alex', 350, 2,
                                         6, 'John Cena', 400, 3,
                                         1, 'Winston', 500, 6,
                                         2, 'Marie', 200, 4
                                 ) as (per_id, per_name, weight, turn));

2 问题分析

解题思路:

由于本题有电梯累计称重不超过1000kg限制,因此很容易想到用累计求和的思路sum(weight) over(order by turn) 先求出累计重量值。

select per_id
     , per_name
     , turn
     , sum(weight) over (order by turn) acc_weight
from elevator

过滤出符合条件的数据,最终SQL如下

select per_name
from elevator
where turn in (select max(turn)
               from (select per_id
                          , per_name
                          , turn
                          , sum(weight) over (order by turn) acc_weight
                     from elevator) t
               where acc_weight <= 1000)


3 小结

本文分析了最后一个能进电梯的人问题的思路和方法,主要利用窗口函数sum()over()构建辅助条件进行分析。

想要进一步了解SQL这门艺术语言的,可以订阅我的专栏数字化建设通关指南,将在该专栏进行详细解析。
专栏 原价99,现在活动价39.9,按照阶梯式增长,还差3个名额将上升至59.9,直到恢复原价。
数字化建设通关指南


主要内容:


(1)SQL进阶实战技巧

可以参考如下教程,具体链接如下

SQL很简单,可你却写不好?也许这才是SQL最好的教程

上面链接中的文章及技巧会不定期更新。

(2)数仓建模实战技巧和个人心得      

      1)新人入职新公司后应如何快速了解业务?

       2)以业务视角看宽表化建设?

       3)  维度建模 or 关系型建模?

       4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?

       5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系                           该由谁来搭建?

       6)如何优雅设计DWS层?DWS层模型好坏该如何评价?

       7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?

       8) 数据架构的选择,mpp or hadoop?

       9)数仓团队应如何体现自己的业务价值,讲好数据故事?

       10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关                          系?

       11)数据部门如何与业务部门沟通,并规划指引业务需求?

文章不限于以上内容,有新的想法也会及时更新到该专栏。

具体专栏链接如下:数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值