是否有可能获得每个项目的明确成本摘要?

时间:2018-07-10 12:27:45

标签: google-cloud-billing

我们已将结算历史记录导出到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

返回以下内容: enter image description here

请注意,我们认为“ Storage PD Capacity”有3个相同的成本,我认为这是可以的,它们可能代表3个不同的永久磁盘。还请注意,尽管再次出现了相同的3个费用,但是这次是针对不同的project.labels.key

我的目标是获得每个project.id的总费用。显然,我不能仅仅发布:

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

因为某些费用将不只一次包含在内(因为它们出现在多个project.labels.key上)。

我无法过滤单个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键。

据我所知,没有办法对“我在每个项目上花费了多少?”这个问题给出了明确的答案。我希望有人可以告诉我我错了,并且有一种方法可以实现这一目标。

2 个答案:

答案 0 :(得分:1)

BigQuery文档herehere应该有用。

具体来说,重复字段将导致重复计数的方式是您平移该字段以使其他行重复。从第二个链接:

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

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

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

希望这会有所帮助!

答案 1 :(得分:0)

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

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"
  )

返回正确的费用 enter image description here

然后可以将其汇总。