大家好,我是Maynor。相信大家和我一样,都有一个大厂梦
,作为一名资深大数据选手,深知SQL重要性,接下来我准备用100天时间,基于大数据岗面试中的经典SQL题
,以每日1题的形式,带你过一遍热门SQL题并给出恰如其分的解答。
一路走来,随着问题加深,发现不会的也愈来愈多。但底气着实足了不少,相信不少朋友和我一样,日积月累才是最有效的学习方式!
人生不如意之事十有八九,剩下的十之一二,超级不如意
求每日每个客户每只股票的市值增长率
客户购买理财hs_asset.stock,描述如下:
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 ‘持仓市值’
);
定义:市值增长率=(当日市值-上日市值)/上日市值, 求每日每个客户每只股票的市值增长率
–假设都是连续日期,没有中断。休市也有持仓记录。
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 中各股票的增长率。具体步骤如下:
提高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;