簡體   English   中英

如何從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,那就太好了。

Campaign有很多SentMessages ,如果加入來計算Campaign.messageSentCount這個計算結果可能會受到影響。 有一個簡單的檢查可以確保聚合函數中沒有引用hasMany多維數據集。 需要這種簡單的健全性檢查以避免導致計算結果不正確的情況。 例如,如果ReceivedMessages也被添加為Campaign的連接,那么如果同時選擇ReceivedMessagesSentMessages 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作為維度沒有任何意義的情況,可以簡化架構並直接使用SentMessages.count

我自己想出了一部分(至少是解決方案部分),我想我會發布以防其他人遇到困難:

看來這個定義是有問題的(而且是不必要的):

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

我相信這樣做的正確方法是向要應用 COUNT 的表添加一個度量。 在此查詢中,我想要 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 多維數據集中時不起作用。 我會等待接受這個答案,因為我是通過實驗發現的,但仍然不清楚問題所在

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM