当前位置: 首页 > news >正文

HQL面试题练习 —— 品牌营销活动天数

题目来源:小红书

目录

  • 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;

拓展:

  1. DATE_ADD函数在SQL和HiveQL(HQL)中的用法有所不同。
  • SQL中的DATE_ADD:
    • DATE_ADD(date, INTERVAL value unit)
      • date:要操作的日期。
      • value:要添加的时间间隔数值。
      • unit:时间间隔的单位,例如DAY、MONTH、YEAR等。
  • HiveQL中的DATE_ADD,通常用来向日期添加指定的天数。
    • DATE_ADD(date, days)
      • date:要操作的日期
      • days:要添加的天数,可以是正数(增加天数)或负数(减少天数)。
  1. space(n)函数生成一个包含n个空格的字符串。
  2. 在Python中,将字符串按空字符串''分割是不合法的,会引发错误。但在Hive中,这种操作是合法的,并且常用于将字符串的每个字符分割成单独的元素
  3. 在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:数组元素的值。

相关文章:

  • 运维的发展前景,会被AI取代吗?
  • python的requests爬虫模块使用代理ip方法---集合
  • python 庆余年2收视率数据分析与可视化
  • VUE3+TS+elementplus创建table,纯前端的table
  • Leaflet【二】图层绘制——UI图层【点线面】 矢量图层【img、svg】
  • Java NIO 基础
  • 使用DockerFile 编写 指令来构建镜像
  • continue插件二次开发调试并打包
  • notepad++ 批量转所有文件编码格式为UTF-8
  • c++中的constexpr 与decltype
  • 5.23 学习总结
  • Python KMP算法
  • 前端常用网站合集
  • 【cocos creator】进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示
  • AI整体架构设计4:理解AI云原生
  • [译]如何构建服务器端web组件,为何要构建?
  • 【剑指offer】让抽象问题具体化
  • Android Volley源码解析
  • es的写入过程
  • hadoop集群管理系统搭建规划说明
  • JS函数式编程 数组部分风格 ES6版
  • js如何打印object对象
  • Promise面试题,控制异步流程
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpringBoot几种定时任务的实现方式
  • 简单实现一个textarea自适应高度
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 树莓派 - 使用须知
  • 追踪解析 FutureTask 源码
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # C++之functional库用法整理
  • #Linux(帮助手册)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (BFS)hdoj2377-Bus Pass
  • (LeetCode) T14. Longest Common Prefix
  • (补)B+树一些思想
  • (独孤九剑)--文件系统
  • (分布式缓存)Redis哨兵
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)kafka实战——kafka源码编译启动
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)fock函数详解
  • (转)大道至简,职场上做人做事做管理
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .Net CF下精确的计时器
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET关于 跳过SSL中遇到的问题
  • .project文件
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国