配置单元中基于月份的有条件选择记录

ekqde3dh  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(655)

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

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

(其中id是客户id,mon是一年中的月份)。我想选择所有的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);

(注意,“…”表示mon值从1到12的所有计数)
有什么更优雅的方法呢?谢谢。
编辑(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次或更多的客户。不过,我现在不需要这个,但它对遇到类似问题的人可能有用。)

rbpvctlc

rbpvctlc1#

这可以通过 group by 以及 having .

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

使用 yeargroup by 如果表中有这样一列。
该解决方案假设每个id每个月有一行,并且没有遗漏月份。如果不是这样,请根据所示的想法修改查询

相关问题