一段时间内的所有日期
返回一段时间内的所有日期
- 背景: 求活动实际进行天数
- 表结构及假数据
- 方法一
- 引子
- 方法二
背景: 求活动实际进行天数
一品牌进行多场营销活动,多场活动起止时间上有重合,求该品牌进行活动的天数,如果活动时间有重复,只能算一次 。
使用工具是: hive sql
表结构及假数据
- 表结构是:
create table if not exists tmp_marketing (brand string comment '品牌',startdate string comment '开始时间',enddate string comment '结束时间'
) comment '品牌活动时间记录';
- 表中假数据:
brand | startdate | enddate |
---|---|---|
苹果 | 2018-09-01 | 2018-09-05 |
苹果 | 2018-09-03 | 2018-09-06 |
苹果 | 2018-09-09 | 2018-09-15 |
mi | 2018-09-09 | 2018-09-15 |
mi | 2018-09-01 | 2018-09-05 |
mi | 2018-09-06 | 2018-09-08 |
- 想要达到的效果
brand | 天数 |
---|---|
mi | 15 |
苹果 | 13 |
方法一
先上代码,配上注释,自行服用哦 ~
with grp_starts as ( -- 该条记录时间与上一条记录对比,标记是否有重复日期select brand, startdate, enddate,case when startdate > max(enddate) over( partition by brand order by startdate, enddate rows between unbounded preceding and 1 preceding ) then 1 else 0 end grp_startfrom tmp_marketing
)
, grps as (--将有重复部分进行聚合select brand, startdate, enddate,sum(grp_start) over( partition by brand order by startdate, enddaterows between unbounded preceding and current row) grpfrom grp_starts
)
select --按照品牌聚合,天数, 得到结果
brand
,sum(diffdates) as `天数`
from
(--得到有重合部分的最小开始时间和最大结束时间,算出时间差,就是活动跨天数
select brand,grp,
min(startdate) start_date,
max(enddate) end_date,
datediff(max(enddate),min(startdate)) +1 as diffdates
from grps
group by brand, grp)
group by brand;
引子
看到本文标题, 就知道方法一,并不是结束, 那么如果知道每个活动的起止时间经历的所有日期, 去重之后,直接聚合, 不是快速且愉快的得到所需结果, 那么有没有这样的函数呢? 扭头,看到了 sequence
来看看这个用法:
SELECT sequence(start_dt, end_dt, INTERVAL 1 DAY) AS date_list
FROM (SELECT date('2021-01-01') AS start_dt, date('2021-01-05') AS end_dt) date_range
date_list |
---|
[2021-01-01, 2021-01-02, 2021-01-03, 2021-01-04, 2021-01-05] |
方法二
一样的, show code ,配上注释,自行服用哦 ~
SELECT --聚合每个品牌的营销天数
brand
,count(1) as `天数`
FROM
(SELECT --爆炸函数,得到每个活动的起止时间经历的所有日期,并且去重
brand
,dt
FROM (SELECTbrand,date(startdate) AS start_dt,date(enddate) AS end_dt from tmp_marketing ) date_range
LATERAL VIEW EXPLODE(sequence(start_dt, end_dt)) date_view AS dt
GROUP BY brand
,dt ) tt
GROUP BY brand
以上.
一段时间内的所有日期相关推荐
- 原生JavaScript获取某一段时间内的所有日期列表
获取指定时间段的所有日期列表,支持转数组.代码如下 const getYMD = (date = new Date()) => {const y = date.getFullYear()cons ...
- Jquery获取一段时间内所有对应的日期,并获取日期对应的星期几。
本文是将已知的一段时间(已知开始时间,结束时间),获取这一段时间内所有的日期,包含开始时间,结束时间,并对应星期几. 1,获取一段时间的字符串,返回的是字符串,调用时在后面加, /*** 获取日期段所 ...
- java 周几_java根据日期获取周几和获取某段时间内周几的日期
整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...
- python两个时间内的工作日_python计算一段时间内的工作日(除周末、除中国节假日、加调休)和所有日期...
python计算一段时间内的工作日(除周末) '计算两个日期之间有几个工作日(除周末).有几天(不除周末)都可以用python里pandas的函数实现. 1. 计算有几个工作日: (1)bdate_r ...
- C#统计一段时间内有多少个星期几
1 ///<summary> 2 /// 统计一段时间内有多少个星期几 3 ///</summary> 4 ///<param name= "AStart &q ...
- 查询一段时间内的具体时间
一.问题描述: 一条订单的记录中有用车的起始时间,现在需要查询一段时间内,每天具体有几个订单.如:一个订单的用车时间为10月1号至10月5号,此时需查询出5条记录: 二.解决方案: 步骤 建表sql ...
- php获取一段时间内的法定工作日
首先,需要自己在后台创建一个表 content_cooper 这个结构如下: CREATE TABLE `my_content_cooper` (`id` int(11) unsigned NOT N ...
- Mysql中查询连续一段时间内统计数据
Mysql中查询连续一段时间内统计数据 在一次生产环境中遇到统计当前日期的前10天每天的订单量,一开始想到的就是根据日期进行分组统计,但在查询的时候会存在一个问题:有可能某一天没有订单交易,日期分组中 ...
- 原生js获取一段时间内每隔几分钟的时间数组
姊妹篇 原生js获取一段时间内每隔几天的时间数组 情况: 项目中有这么一个需求,输入开始时间.结束时间.时间间隔,获取一段时间内每隔几分钟的时间数组 接下来我必须现在网上找找有没有类似的稍微改改就好了 ...
最新文章
- PreTranslateMessage作用和用法
- 机器学习模型如何获得可重复的结果?最佳实践是什么?如何处理random_state参数?
- 智能工厂4.0:数字世界和物理世界的融合【附下载】
- Visual C++ 2011-8-15
- waves效果器_盘点Waves的12款混响插件,你用的是哪个?
- asin c语言中 返回值范围_asin()_C语言asin()详解:反正弦函数,求反正弦值
- 岚图FREE店内静态体验
- 员工为什么缺乏执行力?
- Windows server 2003 DNS子域与委派管理配置指南
- oracle x kglob,x$kglob x$kgllk x$kglpn
- 【Redis学习笔记】Redis特性
- Fortran95学习总结
- 工作流程管理的重要性
- 10 款新鲜出炉的jQuery UI插件
- 2021-2027全球与中国环卫云平台市场现状及未来发展趋势
- 《连线》长文特写李飞飞:已识乾坤大,犹怜草木青
- 我们与专家讨论了JavaScript –文字记录
- TECLAST(台电)双系统板tPAD点评
- 【联邦学习】横向联邦学习(Horizontal Federated Learning,HFL)
- [Android]之一:Android系统下载管理DownloadManager