Hive中基于月记录的条件SELECT

时间:2019-04-02 23:52:03

标签: hive conditional

我有一个表,其中包含年份数据以及每个客户每月的购买数量。看起来像这样:

ID  MON     NUM_PURCHASES
1   1       1
2   1       3
3   1       4
2   2       5

(其中ID是客户ID,mon是一年中的月份)。我想选择所有一年中每月每月至少购买1次的ID。

我正在寻找比以下更优雅的解决方案(这不起作用-请参阅我的编辑2019-04-03):

SELECT distinct id
FROM my_table
where (num_purchases >= 1 and mon = 1) and 
(num_purchases >= 1 and mon = 2) and ...
(num_purchases >= 1 and mon = 12);

(请注意,“ ...”表示从1到12的所有mon值计数)

还有什么更优雅的方法?谢谢。

编辑(2019-04-03):

我意识到上面的查询多么荒谬-除非我转换表并将一位客户的所有记录放在一行中,否则它永远不会返回任何内容:在Vamsi回答之后,我意识到我没有提到我的表没有包含当月购买次数为0的记录,它仅包含(对于客户)如果他在一个月内进行购买的数据(因此缺少几个月) )。

由于Vamsi的解决方案,我找到了解决方法:

select id, total_purchases
FROM
(select id, SUM(CAST(mon as int)) as sum_mon, SUM(CAST(num_purchases as int)) as total_purchases
FROM my_table
group by cid) a where sum_mon == 78;

(再次远离优雅-至少可以使用。但是,它不适用于更一般的情况,即如果表中每个客户有0条记录,或者我们想要选择一个月内购买了2次或更多次。虽然目前我不需要,但是对于遇到类似问题的人来说可能很有用。)

1 个答案:

答案 0 :(得分:1)

这可以通过group byhaving完成。

SELECT id
FROM my_table
GROUP BY id
HAVING SUM(CAST(num_purchases > 0 AS INT)) = 12

如果表具有此类列,请在year中使用group by

该解决方案假定每个id每个月有一行,并且没有丢失的月份。如果不是这种情况,请根据显示的想法修改查询