-1

我正在开发一个项目来构建 ETL 流程和仪表板来控制一些 KPI 指标。我在 BigQuery 中创建了一个表,每月一次,我保存一些键值,这些键值是通过聚合从其他表中提取的数据计算得出的。我正在测量员工发送的电子邮件,因此为了计算其中一个关键值,我需要从两个不同的表中读取并执行左连接以匹配聚合中存在的公司的每个工作区域(左表),该区域有多少员工(右加入)。

这是我的表格的简化:

已发送电子邮件,按区域分组

|  Area Id  |  Service  |  Bad employees  | ...
|     1     |   Gmail   |      3416       | ...
|     2     |   Gmail   |     10782       | ...
|     2     |   Groups  |      9267       | ...

员工总数,按地区分组

|  Area Id  |  Total employees  | ...
|     1     |       34124       | ...
|     2     |       82561       | ...
|     3     |       49472       | ...

问题来了:如您所见,第一个表(已发送的电子邮件)有一个字段没有出现在第二个表中;我说的是Service。出于这个原因,当我加入两个表时,我将获得该Total employees字段的重复值:

连接表

|  Area Id  |  Service  |  Bad employees  |  Total employees  |
|     1     |   Gmail   |      3416       |       34124       |
|     2     |   Gmail   |     10782       |       82561       |
|     2     |   Groups  |      9267       |       82561       |

该最终表格将用于在 Data Studio 中创建报告。我想将该Service字段保留在我的最终表格中,因为我想为用户提供按其过滤的选项。我无法编辑employees 表架构并Service在其条目中添加一个字段,因为该信息在 emails 表中是唯一的,它表示发送电子邮件的服务,与employees 表无关。

我正在努力为这个问题找到一个有效的数据建模选项;如果使用此解决方案并且我想在 Data Studio 上表示,比如说,Total number of employees per selected areas对于包含多个服务的那些区域,我会得到错误的值:

  • 员工总数 1 区: 34.124
  • 总员工区 2: 82.561 + 82.561 = 165.122
  • 员工总数: 34.124 + 165.122 = 199.246
  • 预期值: 34.124 + 82.561 = 116.685

这将影响使用员工总价值的任何指标。

如何保留已Service连接表的字段并在 Data Studio 上仍然表示正确的值Total employees

4

2 回答 2

0

Total employees可以通过平均分配每个区域的服务来解决这个问题。

  • “已发送电子邮件”数据集必须再次包含在混合数据中。唯一的连接键是 记录计数Area Id并添加为度量字段。areas in emails
  • 在图表中添加一个计算字段Total employees / areas in emails
于 2021-09-01T12:22:28.723 回答
0

我通过使用嵌套和重复字段解决了这个问题。我认为 Data Studio 无法按重复字段中的值进行过滤,但我已经检查过它是否可行,因此非常适合我的用例。

连接表模式:

[
  {
    "mode": "REQUIRED",
    "name": "id",
    "type": "INTEGER"
  },
  { 
    "mode": "REPEATED",
    "name": "service",
    "type": "RECORD",
    "fields": [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "bad_employees",
        "type": "INTEGER",
      }
    ]
  },
  {
    "mode": "NULLABLE",
    "name": "total_employees",
    "type": "INTEGER",
    "description": "Sum of the emails sent during off hours for all the sources"
  },
]

连接表表示:

|    id     |  service.name  |  service.bad_employees  |  total_employees  |
|     1     |     Gmail      |          3416           |       34124       |
|     2     |     Gmail      |         10782           |       82561       |
|           |     Groups     |          9267           |                   |

这样,我可以通过 perform 获得正确的 bad_employees 总和,以及通过 获得 total_employeesSUM(service.bad_employees)的正确值SUM(total_employees)

另外,如果我只想按某个服务进行过滤,我可以在该字段上添加一个控件service.name,它会正确过滤。

于 2021-09-02T10:44:08.207 回答