分组(GroupbyItemType)

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

export interface GroupbyItemType {
  _id: string;
  level?: string;
  name?: string;
  schema?: SchemaType;
  order?: string[];
}

标准写法

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

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

理解要点:

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

简写方式

  • 当仅有一个分组维度时可以去掉数组:
{
  "groupby": { "_id": "日期", "level": "month" }
}
  • 如果只有 _id,可以直接写字符串:
{
  "groupby": "产品_品类"
}

与算子结合

分组字段也可以包含算子,例如 $piecewise$bin 等,此时需要写成完整对象:

{
  "groupby": [
    {
      "_id": "年龄",
      "operator": "$piecewise",
      "name": "年龄段"
    }
  ]
}

系统会根据语义建模自动转换为 SQL CASE WHEN 或其他表达式。

自定义排序(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,以免多语言场景下出现列名冲突。