我们已将结算历史记录导出到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
请注意,我们认为“ 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键。
据我所知,没有办法对“我在每个项目上花费了多少?”这个问题给出了明确的答案。我希望有人可以告诉我我错了,并且有一种方法可以实现这一目标。
答案 0 :(得分:1)
具体来说,重复字段将导致重复计数的方式是您平移该字段以使其他行重复。从第二个链接:
“给一个重复字段具有一个或多个值的记录,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"
)
然后可以将其汇总。