专业建设网站企业,网页制作教学,网站常见错误代码,百度推广官网全国开户:sk67666题目来源#xff1a;小红书 目录 1 题目2 建表语句3 题解 1 题目
有营销活动记录表#xff0c;记录了每个品牌每次营销活动的开始日期和营销活动的结束日期#xff0c;现需要统计出每个品牌的总营销天数。 注意#xff1a; 1:苹果第一行数据的营销结束日期比第二行数据的营… 题目来源小红书 目录 1 题目2 建表语句3 题解 1 题目
有营销活动记录表记录了每个品牌每次营销活动的开始日期和营销活动的结束日期现需要统计出每个品牌的总营销天数。 注意 1:苹果第一行数据的营销结束日期比第二行数据的营销开始日期要晚这部分有重叠的日期的要去重计算。 2:苹果第二行数据的营销结束日期和第三行的开始日期不连续2019-09-07以及2019-09-08不统计到营销天数中。 样例数据
----------------------------------
| brand | start_date | end_date |
----------------------------------
| 华为 | 2018-08-04 | 2018-08-05 |
| 华为 | 2018-08-04 | 2020-12-25 |
| 小米 | 2018-08-15 | 2018-08-20 |
| 小米 | 2020-01-01 | 2020-01-05 |
| 苹果 | 2018-09-01 | 2018-09-05 |
| 苹果 | 2018-09-03 | 2018-09-06 |
| 苹果 | 2018-09-09 | 2018-09-15 |
----------------------------------样例结果
-------------------
| brand | act_days |
-------------------
| 华为 | 875 |
| 小米 | 11 |
| 苹果 | 13 |
-------------------2 建表语句 CREATE TABLE IF NOT EXISTS t_marketing_act (brand STRING, --品牌start_date STRING, -- 营销活动开始日期end_date STRING -- 营销活动结束日期
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ,
STORED AS ORC;insert into t_marketing_act(brand, start_date, end_date) values
(华为,2018-08-04,2018-08-05),
(华为,2018-08-04,2020-12-25),
(小米,2018-08-15,2018-08-20),
(小米,2020-01-01,2020-01-05),
(苹果,2018-09-01,2018-09-05),
(苹果,2018-09-03,2018-09-06),
(苹果,2018-09-09,2018-09-15);3 题解 本题难点在解决交叉问题但是题目给出的是开始日期和结束日期我们根据开始和结束日期使用生成函数生成活动期间每天的记录然后根据品牌分组对日期进行去重即可。 -- 2. 根据品牌分组act_date进行去重统计
with t as (
-- 1. 生成每次活动每天的记录
selectbrand,start_date,end_date,t.pos,t.value,date_add(start_date, t.pos) as act_datefrom t_marketing_actlateral view posexplode(split(space(datediff(end_date, start_date)), )) t as pos, value)
selectbrand,count(distinct act_date) as act_days
from t
group by brand;拓展 DATE_ADD函数在SQL和HiveQLHQL中的用法有所不同。 SQL中的DATE_ADD DATE_ADD(date, INTERVAL value unit) date要操作的日期。value要添加的时间间隔数值。unit时间间隔的单位例如DAY、MONTH、YEAR等。 HiveQL中的DATE_ADD通常用来向日期添加指定的天数。 DATE_ADD(date, days) date要操作的日期days要添加的天数可以是正数增加天数或负数减少天数。 space(n)函数生成一个包含n个空格的字符串。在Python中将字符串按空字符串分割是不合法的会引发错误。但在Hive中这种操作是合法的并且常用于将字符串的每个字符分割成单独的元素。在HiveQL中POSEXPLODE 是一个特殊的表生成函数它用于将数组或映射类型的数据展开成多行并且同时生成每个元素的索引和值。 假设有一个包含数组数据的表example_table SELECTid,pos,value
FROM example_table
LATERAL VIEW POSEXPLODE(values) exploded_table AS pos, value;查询结果将会是 在这个例子中 POSEXPLODE(values)将values列中的数组展开。LATERAL VIEW将POSEXPLODE的结果与原始表一起展平。pos数组元素的索引。value数组元素的值。