0

我们已将帐单历史记录导出到 bigquery。我正在尝试获取每个项目的总成本,但我开始认为这是不可能的,因为数据包括project.labels这意味着每个计费项目可以有多行。

这是我刚刚运行的查询:

SELECT   project.labels.key,project.labels.value,service.description,usage_start_time,usage_end_time,project.id,sku.description,cost 
FROM     [our-billing-export] 
WHERE    service.id = "6F81-5844-456A"
  and    usage_start_time = "2018-04-06 19:25:01.510 UTC"
  and    usage_end_time = "2018-04-06 21:25:03.785 UTC"
  and    project.id = "dh-raia"
  and    sku.id = "D973-5D65-BAB2"
order by project.labels.key,project.labels.value,service.id, usage_start_time,usage_end_time,project.id,sku.id,cost

它返回这个: 在此处输入图像描述

请注意,我认为“存储 PD 容量”有 3 个相同的成本,它们可能代表 3 个不同的永久磁盘。还要注意,虽然相同的 3 个成本再次出现,但这次是不同的project.labels.key.

我的目标是获得每project.id. 显然,我不能只发布:

select project.id,sum(cost)
from [our-billing-export]
group by project.id

因为有些成本会不止一次包含在内(因为它们出现在多个project.labels.keys 中)。

我不能只过滤一个project.labels.key,因为我们不保证每个项目都有相同的标签。

我不能尝试消除这样的标签引起的重复:

SELECT   service.id,sku.id,usage_start_time,usage_end_time, project.id,cost
FROM     [our-billing-export]
GROUP BY  service.id,sku.id ,usage_start_time,usage_end_time,project.id,cost

因为这会消除三个有效的行项目,每个项目都具有相同的成本。

我不能使用 OVER() 子句为每个客户端获取单个标签,如下所示:

SELECT   project.labels.key,service.id,usage_start_time,usage_end_time,project.id,sku.id,rownum
FROM     (
         SELECT   project.labels.key,service.id,usage_start_time,usage_end_time,project.id,sku.id,
                  ROW_NUMBER() OVER (PARTITION BY project.id,service.id,usage_start_time,usage_end_time,sku.id,project.labels.key) as rownum
         FROM     [our-billing-export]
         )q
WHERE rownum=1

因为当我这样做时,我收到错误重复字段“project.labels.key”,因为不允许使用 PARTITION BY 键。

所以,据我所知,对于“我在每个项目上花了多少钱?”这个问题,没有办法得到明确的答案。我希望有人能告诉我我错了,并且有办法做到这一点。

4

2 回答 2

1

好的,我已经设法解决了这个问题(在同事的帮助下)

SELECT service.description
,      sku.description
,      project.name
,      labels
,      cost
FROM (
    SELECT  service.description
    ,       sku.description
    ,       project.name
    ,       group_concat(project.labels.key + ':' + project.labels.value) WITHIN RECORD AS labels
    ,       cost
    FROM [our-billing-export] 
    WHERE usage_start_time = "2018-04-06 19:25:01.510 UTC" 
      AND usage_end_time = "2018-04-06 21:25:03.785 UTC" 
      AND project.id = 'dh-raia' AND cost > 0
      AND sku.id = "D973-5D65-BAB2"
  )

返回正确的成本 在此处输入图像描述

然后可以聚合。

于 2018-07-11T14:46:03.850 回答
1

BigQuery 文档herehere应该很有用。

具体来说,重复字段会导致重复计算的方式是,如果您 FLATTEN 该字段以使其他行重复。从第二个链接:

“给定一条记录,其中包含一个或多个重复字段的值,FLATTEN 将创建多条记录,重复字段中的每个值对应一条记录。从记录中选择的所有其他字段在每个新输出记录中都重复。”

除非您展平重复的字段,否则您的简单示例查询(通过 project.id 选择从 [our-billing-export] 组中选择 project.id,sum(cost))不会为您造成重复计算问题。

顺便说一句,除了使用旧版 SQL 和 GROUP_CONCAT ... WITHIN RECORD 来获取作为连接字符串返回的重复字段之外,您还可以在标准 SQL 中使用 TO_JSON_STRING 运算符。请参阅此处的示例。

希望这可以帮助!

于 2018-07-20T05:44:39.870 回答