我有两个配置单元表,客户和交易。
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。
我已经尝试了窗口化,但是我无法通过连接两个表来获得任何线索。
答案 0 :(得分:0)
您可以尝试编写一个子查询,以按amount
乘amount
累积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代替行号。