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

sauutmhj  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(365)

我有两个Hive表,客户和交易。

  1. customer table
  2. ---------------------------------
  3. customer_id | account_threshold
  4. ---------------------------------
  5. 101 | 200
  6. 102 | 500
  7. transaction table
  8. -------------------------------------------
  9. transaction_date | customer_id | amount
  10. -------------------------------------------
  11. 07/01/2018 101 250
  12. 07/01/2018 102 450
  13. 07/02/2018 101 500
  14. 07/03/2018 102 100
  15. 07/04/2018 102 50
  16. Result:
  17. ------------------------------
  18. customer_id | breach_count
  19. ------------------------------
  20. 101 2
  21. 102 1

我必须计算示例的数量,即事务表中的金额之和超过客户表中的account\u阈值。当检测到漏洞时,我将计数器重置为0。
对于客户101,第一个事务高于阈值,因此违约计数为1。在第三笔交易中,101又出现了违约。因此,101的总违约计数是2。对于客户102,第一事务(450)低于阈值。102的下一笔交易是100美元,这违反了500的门槛,因此违约计数将是1。
我试过开窗,但连两张table都搞不懂怎么开。

8yparm6h

8yparm6h1#

您可以尝试编写子查询来获取 amount 订货人 amountcustomer_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

  1. 这里是一个来自sqlserversqlfildde,虽然dbms不同,但是windows函数语法是一样的
  2. [结果]:
customer_idbreach_count
1012
1021
展开查看全部
deikduxw

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。

相关问题