如何在 cubejs 中聚合来自另一个多维数据集的数据?

How to aggregate data from another cube in cubejs?

我有以下多维数据集(我只显示重现问题所需的数据):

已发送消息:

cube(`SentMessages`, {
    sql: `Select * from messages_sent`,
    dimensions: {
        campaignId: {
            sql: `campaign_id`,
            type: `number` 
        },
        phone: {
            sql: `phone_number`,
            type: `number`
        }

    }
});

活动:

cube(`Campaign`, {
 sql: `SELECT * FROM campaign`,
  joins: {
    SentMessages: {
        sql: `${Campaign}.id = ${SentMessages}.campaign_id`,
        relationship: `hasMany`
    }
  },
  measures: {
    messageSentCount: {
        sql: `${SentMessages}.phone`,
        type: `count`
    }
  },
  dimensions: {
    name: {
      sql: `name`,
      type: `string`
    },
  }
});

正在发送的查询如下所示:

  "query": {
    "dimensions": ["Campaign.name"],
    "timeDimensions": [
      {
        "dimension": "Campaign.createdOn",
        "granularity": "day"
      }
    ],
    "measures": [
      "Campaign.messageSentCount"
    ],
    "filters": []
  },
  "authInfo": {
    "iat": 1578961890,
    "exp": 1579048290
  },
  "requestId": "da7bf907-90de-4ba0-80f8-1a802dd442f6"

由于某种原因,这会导致以下错误:

错误:'Campaign.messageSentCount' 引用了导致行乘法的多维数据集。请使用子查询重写。

我已经针对此错误进行了大量搜索,但找不到任何内容。有人可以帮助或提供对问题的一些见解吗?如果框架能够显示仅出于故障排除目的而生成的错误 sql,那就太好了。

我自己想出了其中的一部分(至少是解决方案部分),我想 post 以防其他人遇到困难:

看来这个定义是有问题的(而且是不必要的):

    messageSentCount: {
        sql: `${SentMessages}.phone`,
        type: `count`
    }

我认为执行此操作的正确方法是向要应用 COUNT 的 table 添加度量。在此查询中,我想要 SentMessages.phone 的计数(如上所示),因此应将以下内容添加到 SentMessages 多维数据集。

    count: {
       sql: `phone`
       type: `count`,
    },

那么查询的工作原理如下:

  "query": {
    "dimensions": [
      "Campaign.name"
    ],
    "timeDimensions": [
      {
        "dimension": "SentMessages.createdOn",
        "granularity": "day"
      }
    ],
    "measures": [
      "SentMessages.count"
    ],
    "filters": []
  },
  "authInfo": {
    "iat": 1578964732,
    "exp": 1579051132
  },
  "requestId": "c84b4596-2ee8-48e7-8e0a-974eb284dde3"

它按预期工作。我仍然不明白行乘法错误以及为什么如果将此度量放在 Campaign 多维数据集上则不起作用。我将等待接受这个答案,因为我通过实验发现了这个,仍然不清楚这个问题

Campaign有很多SentMessages,如果加入计算Campaign.messageSentCount这个计算结果可能会受到影响。有一个简单的检查可确保在聚合函数中没有引用 hasMany 多维数据集。需要这种简单的健全性检查以避免导致计算结果不正确的情况。例如,如果 ReceivedMessages 也作为连接添加到 Campaign,那么如果同时选择 ReceivedMessagesSentMessagesCampaign.messageSentCount 将生成不正确的结果。

为避免此完整性检查错误,此处应使用子查询进行替换,如下所示:

已发送消息:

cube(`SentMessages`, {
  sql: `Select * from messages_sent`,

  measures: {
    count: {
      type: `count`
    }
  },

  dimensions: {
    campaignId: {
      sql: `campaign_id`,
      type: `number` 
    },
    phone: {
      sql: `phone_number`,
      type: `number`
    }
  }
});

活动:

cube(`Campaign`, {
 sql: `SELECT * FROM campaign`,
  joins: {
    SentMessages: {
      sql: `${Campaign}.id = ${SentMessages}.campaign_id`,
      relationship: `hasMany`
    }
  },
  measures: {
    totalMessageSendCount: {
      sql: `${messageSentCount}`,
      type: `sum`
    }
  },
  dimensions: {
    messageSentCount: {
      sql: `${SentMessages.count}`,
      type: `number`,
      subQuery: true
    },
    name: {
      sql: `name`,
      type: `string`
    },
  }
});

对于Campaign.messageSentCount作为维度没有任何意义的情况,可以简化schema,直接使用SentMessages.count