如何在 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
,那么如果同时选择 ReceivedMessages
和 SentMessages
,Campaign.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
。
我有以下多维数据集(我只显示重现问题所需的数据):
已发送消息:
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
,那么如果同时选择 ReceivedMessages
和 SentMessages
,Campaign.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
。