通过重置计数器配置单元条件计数?

时间:2018-08-04 08:10:26

标签: sql hive hiveql

我有两个配置单元表,客户和交易。

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_threshold。 当检测到违规时,我会将计数器重置为0。

对于客户101,第一笔交易高于阈值,因此,违规计数为1。然后在第三笔交易中再次存在针对101的违规。因此,101的总违规计数为2。 对于客户102,第一交易(450)低于阈值。下一笔102的交易是$ 100,超过了500的门槛,所以Break_count将是1。

我已经尝试了窗口化,但是我无法通过连接两个表来获得任何线索。

2 个答案:

答案 0 :(得分:0)

您可以尝试编写一个子查询,以按amountamount累积customer_id的顺序,然后基于Outer JOIN然后{{1} }

customer

这是来自Sqlserver的sqlfildde,虽然DBMS不同,但是Windows函数语法是相同的

[结果]

Count

答案 1 :(得分:0)

要在值更改时重置计数/排名/总和

输入表:- 时间|值 12 | A 13 | A 14 | C 15 | C 16 | B 17 | B 18 | A

您只需要花一点时间就可以知道以前的值 步骤1.选择*,lag(status)作为lagval

现在将滞后值与实际值进行比较,如果不同,则将其取为1,否则为0(将此列作为标志) 步骤2.选择*,如果出现滞后! =状态,然后1,否则0

现在“求和超过”标志将其作为运行总和-您将获得每个组不同的总和值,组表示每次值更改其新组时 步骤3.选择*,求和(标志)超过(按时间顺序)flag_sum

现在每个组只显示行号

第4步,选择Rownumber()结束(按flag_sum按时间顺序进行分区)

最终结果

时间|价值| lagval |标志| flag_sum |行号 12 | A |空| 1 | 1 | 1个 13 | A | A | 0 | 1 | 2 14 | C | A | 1 | 2 | 1 15 | C | C | 0 | 2 | 2 16 | B | C | 1 | 3 | 1 17 | B | B | 0 | 3 | 2 18 | A | B | 1 | 4 | 1

无论值何时更改,都可以使用sum / count代替行号。

相关问题