目前没想到太好的解决方案,只是按部就班处理,有好方法的记得提醒我下。
需求是这样子的:
1.动态配置客户级别的判断逻辑。
根据客户资产(必选)+交易量(可选)来 给客户定级
2.对指定的客户,单独配置
踩坑:
不走微服务,用Oracle过程实现, 这不是很简单么,动态SQL整一个就好。
然后就踩坑里了, 这数据存在了HIVE上, 业务结果也会落地HIVE,然后结果推送ES、同步Oracle。
而配置表则在Oralce。
当逻辑也放到impala上执行时,发现impala不支持动态拼接SQL。
想了半天 也没啥太好的办法, 好在条件比较简单,就硬着头皮按原始写下来了。
也给后来者 一个不是解决方法的方法吧。
实现:
界面效果:
客户级别 | 优先级 | 定级指标 | 指标下限(包含) | 指标上限(不包含) | 逻辑运算 | 定级指标2 | 计算方式 | 指标2参数(包含) |
空户 | 1 | 资产 | 0 | 1,000 | 且 | 交易量 | 大于 | 100 |
一级 | 2 | 资产 | 0 | 10,000 | ||||
二级 | 3 | 资产 | 10,000 | 100,000 | ||||
三级 | 4 | 资产 | 100,000 | 500,000 | ||||
四级 | 5 | 资产 | 500,000 | 3,000,000 | ||||
五级 | 6 | 资产 | 3,000,000 |
表定义:
客户级别配置表
id
khjb 客户级别
pri 优先级,1为优先最高
zblx 指标类型(条件一)
lower_limit 指标下限(包含)
upper_limit 指标上限(不包含)
ljys 逻辑运算:1|且;2|或
zblx2 指标类型(条件二)
jsfh 条件二:计算方式 1|大于;2|小于;3|等于;4|大于等于;5|小于等于
lower_limit2 条件二:参数
客户级别定义
id
JBMC 级别名称
XH 级别序号(我以此字段为关键字)
代码逻辑:
SELECT KHH, XH as KHJB
FROM (SELECT KHH, XH,
ROW_NUMBER() OVER(PARTITION BY KHH ORDER BY PRI) AS RN --按优先级排序
FROM (SELECT A.KHH,
JB.XH,
GZ.PRI,
CASE
WHEN ZBLX = 1 THEN
A.ZZC >= GZ.LOWER_LIMIT AND A.ZZC < GZ.UPPER_LIMIT
ELSE
FALSE
END AS LIMIT1, --条件1单独判断
CASE
WHEN GZ.JSFH = 1 THEN
A.JYL > GZ.LOWER_LIMIT2
WHEN GZ.JSFH = 2 THEN
A.JYL < GZ.LOWER_LIMIT2
WHEN GZ.JSFH = 3 THEN
A.JYL = GZ.LOWER_LIMIT2
WHEN GZ.JSFH = 4 THEN
A.JYL >= GZ.LOWER_LIMIT2
WHEN GZ.JSFH = 5 THEN
A.JYL <= GZ.LOWER_LIMIT2
ELSE
FALSE
END AS LIMIT2, --条件2单独判断
GZ.LJYS
FROM 客户资产表 A,
客户级别配置表 GZ
LEFT JOIN 客户级别定义 JB
ON JB.SX = GZ.KHJB) T
WHERE CASE
WHEN LJYS IS NULL THEN
LIMIT1
WHEN LJYS = 1 THEN
LIMIT1 AND LIMIT2
WHEN LJYS = 2 THEN
LIMIT1 OR LIMIT2
ELSE
FALSE
END -- --条件1 和 条件2 逻辑处理
) T2
WHERE RN = 1 --同时满足,取优先级高的,确保一个客户只对应一个级别