每天一道大厂SQL题【Day23】华泰证券真题实战(五)

2023-04-27 20:46:20 浏览数 (1)

每天一道大厂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 中各股票的增长率。具体步骤如下:

  1. 内层子查询中,通过 lag() 函数获取每只股票的上一个交易日的市值,即 last_market_value。
  2. 在外层查询中,选取所有列并增加一列 incre_rate,在这列中计算每只股票的增长率。
  3. 增长率的计算方式为 (market_value - last_market_value) / last_market_value,其中 market_value 表示某只股票的当日市值,last_market_value 表示前一天的市值。
  4. 需要注意的是,如果上一个交易日的市值为 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;

0 人点赞