2

我有一个要求——我需要对作为输入提供的日期范围进行数据汇总。更具体地说:如果我的数据如下所示:

Input:
Id|amount|date
1 |10    |2016-01-01
2 |20    |2016-01-02
3 |20    |2016-01-03
4 |20    |2016-09-25
5 |20    |2016-09-26
6 |20    |2016-09-28

如果我想要 9 月份的摘要,那么我需要计算 4 个范围内的记录数,这些范围是:

  1. 当前日期,即 9 月的每一天。
  2. 周开始日期(根据当前日期的星期几)到当前日期,例如。如果当前日期为 2016 年 9 月 28 日,则周开始日期为 2016 年 9 月 25 日,记录计数在 2016 年 9 月 25 日到 2016 年 9 月 28 日之间。
  3. 月份开始日期到当前日期,即从 2016-09-01 到当前日期。
  4. Year Start Date to Current Date,即从 2016-01-01 到当前日期的记录数。

所以我的输出应该有一个记录,每个月的每一天都有 4 列(在这种情况下,月份是九月),比如

Output:

 Current_Date|Current_date_count|Week_To_Date_Count|Month_to_date_Count|Year_to_date_count

 2016-09-25  |1                 |1                 |1                  |4
 2016-09-26  |1                 |2                 |3                  |5
 2016-09-28  |1                 |3                 |3                  |6

重要提示:我只能传递 2 个变量,即范围开始日期和范围结束日期。休息计算需要是动态的。

提前致谢

4

1 回答 1

1

您可以按年加入,然后分别测试每个条件(使用sum(if())):

select  a.date, sum(if(a.date=b.date,1,0)), 
                sum(if(month(a.date)=month(b.date) and weekofyear(a.date)=weekofyear(b.date),1,0)),
                sum(if(month(a.date)=month(b.date),1,0)),
                count(*) from
(select * from input_table where date >= ${hiveconf:start} and date <${hiveconf:end}) a, 
(select * from input_table where date <${hiveconf:end}) b 
where year(a.date)=year(b.date) and b.date <= a.date group by a.date;
于 2016-10-29T05:40:37.310 回答