在 ToC 行业中,由于客户数量庞大(规模达到数万、十万甚至更多),难以以单个客户的视角观测数据的变化。通常需要根据一定规则对客户进行分类, 并从不同视角分析各类客户的数据表现,以此作为营销决策依据。典型的行业包括泛零售、金融证券以及政府财税等领域。在部分 ToB 行业中, 尤其是面向中小企业提供商品或服务的行业,也存在类似的需求。这些行业的客户分类方法相对灵活。尽管经过时间积累,已经形成了许多固化的分类规则, 但在实际数据分析中,这些固化分类与其他统计指标的组合方式往往无法固定化。要生成新的数据分析报告,仍需依赖数据工程师的支持。
除了基于聚合值规则对客户或商品进行分类外,客户标签或客户画像经常会被用于筛选数据,传统 BI 中,往往需要通过代码或大量 SQL,预先根据业务规则, 计算相应的标签值并存储在相应的数据库表中,实际使用时,通过编写查询 SQL 为业务部门提供服务。当计算标签的规则发变化时,或者增加新的标签时, 数据工程师需要重新开发。
在上述背景下,Agile Query 设计了
SEGMENT(
caseWhenExpression,
column
[, filterExpression]
)
caseWhenExpression:
CASE WHEN booleanExpression THEN expression [ WHEN booleanExpression THEN expression ]* END
booleanExpression:
averageFunctionCall comparisonOperator numericalLiteral
| averageFunctionCall BETWEEN numericalLiteral AND numericalLiteral
SEGMENT(
CASE
WHEN COUNT(orders.order_id) > 10
AND SUM(order_details.quantity * order_details.unit_price) > 1000 THEN '高价值客户'
WHEN COUNT(orders.order_id) LBETWEEN 5 AND 10
AND SUM(order_details.quantity * order_details.unit_price) > 500 THEN '中等值客户'
WHEN COUNT(orders.order_id) LBETWEEN 2 AND 5
AND SUM(order_details.quantity * order_details.unit_price) > 100 THEN '一般客户'
ELSE '其它'
END,
customers.customer_id,
orders.order_date = LAST_YEARS(1)
)
SEGMENT(
CASE
WHEN COUNT_IF(products.product_name = '牛奶', orders.order_id) > 0 THEN '牛奶客'
WHEN COUNT_IF(products.product_name = '豬肉', orders.order_id) > 0 THEN '豬肉客'
WHEN COUNT_IF(products.product_name = '巧克力', orders.order_id) > 0 THEN '巧克力客'
WHEN COUNT_IF(products.product_name = '花生', orders.order_id) > 0 THEN '花生客'
WHEN COUNT_IF(products.product_name = '糖果', orders.order_id) > 0 THEN '糖果客'
ELSE '其它'
END,
customers.customer_id,
orders.order_date = LAST_YEARS(1)
)
上述示例中,基于去年的数据识别一个客户是否购买过 "牛奶","豬肉","牛奶","巧克力","花生"等商品,实际数据分析时, 会根据商品销售的优先级(商品销售对企业的重要性)对客户进行分类,也就是购买过"牛奶"的客户的重要性相比"豬肉客"更重要,更有经营的价值。
--海鲜客
SEGMENT(
CASE
WHEN COUNT_IF(categories.category_name = '海鮮', orders.order_id) > 0 THEN '是' ELSE '否'
END,
customers.customer_id,
orders.order_date = LAST_YEARS(1)
)
尽管