返回一段时间内的所有日期

  • 背景: 求活动实际进行天数
    • 表结构及假数据
    • 方法一
    • 引子
    • 方法二

背景: 求活动实际进行天数

一品牌进行多场营销活动,多场活动起止时间上有重合,求该品牌进行活动的天数,如果活动时间有重复,只能算一次 。
使用工具是: hive sql

表结构及假数据

  1. 表结构是:
create table if not exists tmp_marketing (brand string comment '品牌',startdate string comment '开始时间',enddate string comment '结束时间'
) comment '品牌活动时间记录';
  1. 表中假数据:
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
  1. 想要达到的效果
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

以上.

一段时间内的所有日期相关推荐

  1. 原生JavaScript获取某一段时间内的所有日期列表

    获取指定时间段的所有日期列表,支持转数组.代码如下 const getYMD = (date = new Date()) => {const y = date.getFullYear()cons ...

  2. Jquery获取一段时间内所有对应的日期,并获取日期对应的星期几。

    本文是将已知的一段时间(已知开始时间,结束时间),获取这一段时间内所有的日期,包含开始时间,结束时间,并对应星期几. 1,获取一段时间的字符串,返回的是字符串,调用时在后面加, /*** 获取日期段所 ...

  3. java 周几_java根据日期获取周几和获取某段时间内周几的日期

    整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...

  4. python两个时间内的工作日_python计算一段时间内的工作日(除周末、除中国节假日、加调休)和所有日期...

    python计算一段时间内的工作日(除周末) '计算两个日期之间有几个工作日(除周末).有几天(不除周末)都可以用python里pandas的函数实现. 1. 计算有几个工作日: (1)bdate_r ...

  5. C#统计一段时间内有多少个星期几

    1 ///<summary> 2 /// 统计一段时间内有多少个星期几 3 ///</summary> 4 ///<param name= "AStart &q ...

  6. 查询一段时间内的具体时间

    一.问题描述: 一条订单的记录中有用车的起始时间,现在需要查询一段时间内,每天具体有几个订单.如:一个订单的用车时间为10月1号至10月5号,此时需查询出5条记录: 二.解决方案: 步骤 建表sql ...

  7. php获取一段时间内的法定工作日

    首先,需要自己在后台创建一个表 content_cooper 这个结构如下: CREATE TABLE `my_content_cooper` (`id` int(11) unsigned NOT N ...

  8. Mysql中查询连续一段时间内统计数据

    Mysql中查询连续一段时间内统计数据 在一次生产环境中遇到统计当前日期的前10天每天的订单量,一开始想到的就是根据日期进行分组统计,但在查询的时候会存在一个问题:有可能某一天没有订单交易,日期分组中 ...

  9. 原生js获取一段时间内每隔几分钟的时间数组

    姊妹篇 原生js获取一段时间内每隔几天的时间数组 情况: 项目中有这么一个需求,输入开始时间.结束时间.时间间隔,获取一段时间内每隔几分钟的时间数组 接下来我必须现在网上找找有没有类似的稍微改改就好了 ...

最新文章

  1. PreTranslateMessage作用和用法
  2. 机器学习模型如何获得可重复的结果?最佳实践是什么?如何处理random_state参数?
  3. 智能工厂4.0:数字世界和物理世界的融合【附下载】
  4. Visual C++ 2011-8-15
  5. waves效果器_盘点Waves的12款混响插件,你用的是哪个?
  6. asin c语言中 返回值范围_asin()_C语言asin()详解:反正弦函数,求反正弦值
  7. 岚图FREE店内静态体验
  8. 员工为什么缺乏执行力?
  9. Windows server 2003 DNS子域与委派管理配置指南
  10. oracle x kglob,x$kglob x$kgllk x$kglpn
  11. 【Redis学习笔记】Redis特性
  12. Fortran95学习总结
  13. 工作流程管理的重要性
  14. 10 款新鲜出炉的jQuery UI插件
  15. 2021-2027全球与中国环卫云平台市场现状及未来发展趋势
  16. 《连线》长文特写李飞飞:已识乾坤大,犹怜草木青
  17. 我们与专家讨论了JavaScript –文字记录
  18. TECLAST(台电)双系统板tPAD点评
  19. 【联邦学习】横向联邦学习(Horizontal Federated Learning,HFL)
  20. [Android]之一:Android系统下载管理DownloadManager

热门文章

  1. 使用第三方安装程序将Windows桌面应用打包
  2. JavaScript课后练习
  3. 选择Windows7的49个理由
  4. Codeforces 1327 C. Game with Chips
  5. 淘宝网返回顶部JS代码效果
  6. ACdream 1216 Beautiful People 二路最长上升子序列
  7. Githup授权及文件上传
  8. 华为交换机配置远程wbe管理详解
  9. 【成功案例】智能企业的可持续转型
  10. c#模拟看板控件_ComponentOne for Winform