分组(GroupbyItemType)

groupby 指定结果的维度分组,对应 SQL 的 GROUP BY 子句。接口结构如下:

export interface GroupbyItemType {
  _id: string;
  level?: string;
  name?: string;
  schema?: SchemaType;
  order?: string[];
  property?: Pick<PropertyType, 'type' | 'primal_type'>;
}

标准写法

Logicform 支持多维分组,因此 groupby 通常是一个数组:

{
  "groupby": [
    { "_id": "日期", "level": "year" },
    { "_id": "地理位置", "level": "省市" },
    { "_id": "产品_品类" }
  ]
}

理解要点:

  1. _id 填写语义层中定义的维度名称。
  2. level 控制时间或地域维度的粒度,例如 year/month/day省市/城市/区县
  3. name 可覆盖结果中的列名,常用于英文项目。
  4. schema 用于跨模型下钻;系统会根据语义层映射自动补齐 JOIN。
  5. order 手动指定枚举维度的排序顺序,避免依赖默认字典序。

_id 也可以写成带下划线的跨表字段路径,例如 门店_重点客户系统物料_品牌_品类。这类路径的规则见 基础结构 中的“跨表字段路径”。

标准输入与归一化

LogicformTypegroupby 的正式类型是 GroupbyItemType[]。因此:

  • 标准 Logicform、落库结果和调试时,建议始终写成数组。
  • 某些输入入口可能接受“单对象”或“字符串”简写,但在执行前应先归一化为 GroupbyItemType[]
  • 分段、分桶等高级需求通常会在上层流程中被归一化成标准 groupby 项,GroupbyItemType 本身没有 operator 字段。

下钻与内部字段

  • schema:这里的类型是 SchemaType,主要用于“GroupbyItem 同时也作为下钻维度对象”这类内部场景,通常由系统补齐,不建议手写字符串。
  • property:执行期补充的属性类型信息,用于记录该维度对应 property 的 type / primal_type,一般不需要手写。

自定义排序(order)

对于枚举类型维度(如星期、季度、评价等级等),使用 order 字段指定自定义顺序:

{
  "groupby": [
    {
      "_id": "星期",
      "name": "weekday",
      "order": ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
    }
  ],
  "sort": { "weekday": 1 }
}

没有 order 时,系统会按照默认字典序排列,可能导致"周五"排在"周一"之前。指定 order 后,排序和显示都会遵循数组顺序。

常见使用场景:

场景order 示例
星期几["周一", "周二", ..., "周日"]
月份["一月", "二月", ..., "十二月"]
季度["Q1", "Q2", "Q3", "Q4"]
评价等级["优秀", "良好", "中等", "较差"]
优先级["高", "中", "低"]

注意事项

  1. Logicform 不直接提供 LEFT JOIN 的显式语法,语义层会按照字段的“引用关系”自动生成 LEFT JOIN,确保维度缺失时仍能返回 NULL
  2. 依赖时间层级时请确保语义层中已开启对应粒度,否则 level 会被忽略。
  3. 当与 havingsort 配合使用时,建议为每个分组维度设置稳定的 name,以免多语言场景下出现列名冲突。