我有两个Hive表,客户和交易。
customer table
---------------------------------
customer_id | account_threshold
---------------------------------
101 | 200
102 | 500
transaction table
-------------------------------------------
transaction_date | customer_id | amount
-------------------------------------------
07/01/2018 101 250
07/01/2018 102 450
07/02/2018 101 500
07/03/2018 102 100
07/04/2018 102 50
Result:
------------------------------
customer_id | breach_count
------------------------------
101 2
102 1
我必须计算示例的数量,即事务表中的金额之和超过客户表中的account\u阈值。当检测到漏洞时,我将计数器重置为0。
对于客户101,第一个事务高于阈值,因此违约计数为1。在第三笔交易中,101又出现了违约。因此,101的总违约计数是2。对于客户102,第一事务(450)低于阈值。102的下一笔交易是100美元,这违反了500的门槛,因此违约计数将是1。
我试过开窗,但连两张table都搞不懂怎么开。
2条答案
按热度按时间8yparm6h1#
您可以尝试编写子查询来获取
amount
订货人amount
由customer_id
,那么Outer JOIN
基于customer
那么Count
```SELECT t.customer_id, COUNT(t.totle) breach_count
FROM customer c
LEFT JOIN
(
select t1.*,SUM(t1.amount) OVER(PARTITION BY t1.customer_id order by t1.amount) as totle
from transaction1 t1
) t on c.customer_id = t.customer_id
WHERE c.account_threshold < t.totle
GROUP BY t.customer_id
deikduxw2#
每当值更改时重置计数/秩/和
输入表:-时间值12 | a 13 | a 14 | c 15 | c 16 | b 17 | b 18 | a
您只需要取lag就可以知道前面的值step1.select*,lag(status)as lagval
现在比较滞后值和实际值,如果不同,则取1或0(将此列作为标志)步骤2。选择*,lagval!=状态1或0
现在do sum over标志将其作为运行sum-您将得到每个组不同的sum值,group意味着当nver值更改为新的组时第3步。选择*,sum(标志)over(order by time)标志\u sum
现在只需要每组的行号
步骤4.select rownumber()over(partition by flag\u sum order by time)
最终结果
时间值|时间值|时间值|时间值|值|时间值|时间值|时间值|时间值|时间值|时间值|拉格瓦尔|旗帜|旗帜|旗帜|旗帜|旗帜|旗帜|行数字12 | 12 | a 124;a 124;1 124;1 1 13 124;1 13 | 1 | a 124;a 124;a 124;a 124;a 124;a 124;a 124;a |值124;值| a | b | 1 | 4 | 1
无论值何时更改,都可以使用sum/count来代替rownumber。