Hive中基于月份的记录的条件SELECT

问题描述 投票:0回答:1

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

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个或更多的客户在一个月内购买。但我现在不需要这个,但它可能对遇到类似问题的人有用。)

hive conditional
1个回答
1
投票

这可以用group byhaving完成。

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

如果表中有这样的列,请在year中使用group by

该解决方案假设每个帐户每月有一行,并且没有错过的月份。如果不是这样,请根据显示的想法修改查询

© www.soinside.com 2019 - 2024. All rights reserved.