特色函数

在 ToC 行业中,由于客户数量庞大(规模达到数万、十万甚至更多),难以以单个客户的视角观测数据的变化。通常需要根据一定规则对客户进行分类, 并从不同视角分析各类客户的数据表现,以此作为营销决策依据。典型的行业包括泛零售、金融证券以及政府财税等领域。在部分 ToB 行业中, 尤其是面向中小企业提供商品或服务的行业,也存在类似的需求。这些行业的客户分类方法相对灵活。尽管经过时间积累,已经形成了许多固化的分类规则, 但在实际数据分析中,这些固化分类与其他统计指标的组合方式往往无法固定化。要生成新的数据分析报告,仍需依赖数据工程师的支持。

除了基于聚合值规则对客户或商品进行分类外,客户标签或客户画像经常会被用于筛选数据,传统 BI 中,往往需要通过代码或大量 SQL,预先根据业务规则, 计算相应的标签值并存储在相应的数据库表中,实际使用时,通过编写查询 SQL 为业务部门提供服务。当计算标签的规则发变化时,或者增加新的标签时, 数据工程师需要重新开发。

在上述背景下,Agile Query 设计了

SEGMENT
函数,基于一系列聚合规则对指定的维度进行分类,同时,支持与其它聚合指标自由组合, 为数据分析师或运营人员提供自助式基于客户分类的数据统计。本文将详细介绍
SEGMENT
函数在分类统计场景下的各种形式的应用。

SEGMENT 函数介绍

SEGMENT(
    caseWhenExpression,
    column
    [, filterExpression]
)

caseWhenExpression:
    CASE WHEN booleanExpression THEN expression [ WHEN booleanExpression THEN expression ]* END

booleanExpression:
    averageFunctionCall comparisonOperator numericalLiteral
    | averageFunctionCall BETWEEN numericalLiteral AND numericalLiteral
  • caseWhenExpression
    :一种逻辑判断表达式,根据一个或多个聚合值的过滤规则,输出一个或多个分类结果
  • column
    :通常为分类维度的主键,例如:
    customers.customer_id
    products.product_id
  • filterExpression
    :用于过滤分类数据的范围,例如:查看去年购买过某商品的客户,在今年购买了哪些商品,每商品的销售额是多少?

示例 1

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)
)
  • LBETWEEN
    :为 Agile Query 内部关键字,主要为解决 SQL 中的
    BETWEEN
    为左右闭区间,而
    LBETWEEN
    为为左闭区间
  • CASE
    表达式用于基于聚合值规则对客户进行分类,示例中基于订单数量和销售额对客户进行分类
  • orders.order_date = LAST_YEARS(1)
    用于对过滤规则中数据进行过滤
  • LAST_YEARS
    为动态时间函数,每次查询时会根据当前时间计算

示例 2

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)
)

总结

SEGMENT
主要用于灵活的标签化数据筛选或基于自定义分类规则的数据分析。在营销场景中,通常需要根据多样化规则筛选客群,以推动后续的营销活动。 目前,市场上已有许多会员管理工具能够自动完成标签计算,但在新增或修改标签时,仍需重复开发和预计算。当需求不明确或设计不充分时,开发周期往往会因此延长。

SEGMENT
函数生成的 SQL 复杂度较高,在大数据量参与计算时可能导致计算瓶颈。然而,当计算涉及的最大数据量少于 1 亿行时, 在 MPP 型数据库中,通常可在数秒内完成。

尽管

SEGMENT
函数的计算复杂度较高,但在实际使用场景中,参与计算的数据量通常非常有限。经过时间维度筛选后,大多数情况下,计算数据量少于 1 亿行。 即使在超大数据量的情况下,MPP 数据库的计算引擎也能够在分钟级别完成查询。在一些中小零售企业中,数据体量基本在千万级别,所以
SEGMENT
函数在实际的数据分析场景中应用非常广泛。

全天候售后服务
7x24小时专业工程师品质服务
极速服务应答
秒级应答为业务保驾护航
客户价值为先
从服务价值到创造客户价值
全方位安全保障
私有化部署,充分保证数据安全
©2022-2025 上海磊数信息技术有限公司
沪ICP备2024066390号-1