在过去的日期范围内运行查询

时间:2013-06-06 23:15:58

标签: sql hive hiveql

我有一个相当有趣的问题,我首先想到的是直截了当,但事实证明它更复杂。

我有这样的数据:

Date             User ID
2012-10-11         a
2012-10-11         b
2012-10-12         c
2012-10-12         d 
2012-10-13         e
2012-10-14         b
2012-10-14         e
...                ...

每一行都有一个日期,用户ID对,表示该用户当天处于活动状态。用户可以出现在多个日期,日期将有多个用户 - 就像示例中一样。我有这样的数百万行,涵盖了大约90天的时间范围。

以下是问题:对于每一天,我想获得过去10天内没有活动的用户数量。例如,如果用户“a”在2012-05-31有效,但在06-01和06-10之间的任何一天都没有激活,我想在6月10日计算这个用户。在接下来的几天里我不会再算他了,除非他变得活跃并且再次消失。

我可以在SQL中执行此操作,还是需要某种脚本来按照我想要的方式组织数据。你的建议是什么?我使用Hive。

非常感谢你!

1 个答案:

答案 0 :(得分:2)

我认为您可以在与Hive兼容的SQL中执行此操作。这是想法。

  1. 为每个用户/日期获取用户的下一个日期。
  2. 如果原始记录在当前记录之后不到10天,则丢弃原始记录。
  3. 将日期添加10
  4. 汇总和计算
  5. 我不确定日期之类的所有Hive函数。以下是如何执行此操作的示例:

    select date+10, count(*)
    from (select t.userid, t.date,
                 min(case when tnext.date > t.date then tnext.date end) as nextdate
          from t left outer join
               t tnext
               on t.userid = tnext.userid
          group by t.userid, t.date
         ) t
    where nextdate is null or nextdate - date >= 10
    group by date+10;
    

    请注意,使用以下内容可以更好地编写内部子查询:

    on t.userid = tnext.userid and t2.date > t.date
    

    但是,我不知道Hive是否支持这样的连接(它不支持非等值连接,并且不清楚一个或所有子句是否必须相等)。