每天一道大厂SQL题【Day23】华泰证券真题实战(五)
大家好,我是Maynor。相信大家和我一样,都有一个大厂梦
,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题
,以每日1题的形式,带你过一遍热门SQL题并给出恰如其分的解答。
一路走来,随着问题加深,发现不会的也愈来愈多。但底气着实足了不少,相信不少朋友和我一样,日积月累才是最有效的学习方式!
每日语录
人生不如意之事十有八九,剩下的十之一二,超级不如意
第23题:
需求列表
求每日每个客户每只股票的市值增长率
客户购买理财hs_asset.stock,描述如下:
代码语言:javascript复制create table hs_asset.stock(
init_date integer comment ’ 日 期 ',
clinet_id varchar(20)
comment ‘客户号’,
stock_code varchar (6)
comment ’ 股 票 代 码 ',
market_value numeric(38,20)
comment ‘持仓市值’
);
定义:市值增长率=(当日市值-上日市值)/上日市值, 求每日每个客户每只股票的市值增长率
–假设都是连续日期,没有中断。休市也有持仓记录。
代码语言:javascript复制create or replace temporary view
stock(init_date, client_id, stock_code, market_value)
as values
(‘2021-09-01’, 1, ‘001’, 100),
(‘2021-09-02’, 1, ‘001’, 200),
(‘2021-09-03’, 1, ‘001’, 300),
(‘2021-09-01’, 1, ‘002’, 500),
(‘2021-09-02’, 1, ‘002’, 400),
(‘2021-09-03’, 1, ‘002’, 300),
(‘2021-09-01’, 2, ‘003’, 100),
(‘2021-09-02’, 2, ‘003’, 200),
(‘2021-09-03’,; 2, ‘003’, 300)
思路分析
计算股票表 stock 中各股票的增长率。具体步骤如下:
- 内层子查询中,通过 lag() 函数获取每只股票的上一个交易日的市值,即 last_market_value。
- 在外层查询中,选取所有列并增加一列 incre_rate,在这列中计算每只股票的增长率。
- 增长率的计算方式为 (market_value - last_market_value) / last_market_value,其中 market_value 表示某只股票的当日市值,last_market_value 表示前一天的市值。
- 需要注意的是,如果上一个交易日的市值为 0,则增长率为 null。
文末SQL小技巧
提高SQL功底的思路。 1、造数据。因为有数据支撑,会方便我们根据数据结果去不断调整SQL的写法。 造数据语法既可以create table再insert into,也可以用下面的create temporary view xx as values语句,更简单。 其中create temporary view xx as values语句,SparkSQL语法支持,hive不支持。 2、先将结果表画出来,包括结果字段名有哪些,数据量也画几条。这是分析他要什么。 从源表到结果表,一路可能要走多个步骤,其实就是可能需要多个子查询,过程多就用with as来重构提高可读性。 3、要由简单过度到复杂,不要一下子就写一个很复杂的。 先写简单的select from table…,每个中间步骤都执行打印结果,看是否符合预期, 根据中间结果,进一步调整修饰SQL语句,再执行,直到接近结果表。 4、数据量要小,工具要快,如果用hive,就设置set hive.exec.mode.local.auto=true;如果是SparkSQL,就设置合适的shuffle并行度,set spark.sql.shuffle.partitions=4;