sql - 同一 cloumn 上两个值的百分比差异
问题描述
我想从 avg 列中获取两个值之间的百分比差异,以作为方差显示在不同的列中。以下示例是虚拟表,因为表中的数据很大。值不一定相同。
每个资源 id 的第一个值是当前月份的值,而另一个是之前所有月份的平均值。此结果是从两个查询的“union all”中获得的。我想计算每个资源 id 的平均值的百分比增加/减少
桌子
resource_id avg
----------- -------
101 20
101 15
102 18
102 20
我需要的结果
resource_id variance
----------- ---------
101 25
102 -10
我从中获取表格的原始查询。
SELECT resource_id,
avg
FROM (SELECT resource_id,
Avg(sum_cost) AS AVG
FROM (SELECT resource_id,
month,
Sum(sum_cost)AS SUM_COST
FROM (SELECT billing_bigquery_data.labels_value AS
resource_id
,
Extract(month FROM Date(
usage_start_time)) AS MONTH,
Sum(cost) AS
sum_cost
FROM PUBLIC.billing_bigquery_data
INNER JOIN PUBLIC.conf_data_history
ON billing_bigquery_data.labels_value =
conf_data_history.resource_id
WHERE conf_data_history.metric_name IN( 'VOLUME_TYPE' )
AND labels_key IN( 'disk_id', 'instance_id' )
AND Extract(month FROM Date(usage_start_time)) !=
'12'
GROUP BY conf_data_history.metric_value,
billing_bigquery_data.labels_value,
billing_bigquery_data.usage_start_time)AS test
GROUP BY month,
resource_id
ORDER BY resource_id) AS test
GROUP BY resource_id
UNION ALL
SELECT resource_id,
Avg(sum_cost) AS AVG
FROM (SELECT resource_id,
month,
Sum(sum_cost)AS SUM_COST
FROM (SELECT billing_bigquery_data.labels_value AS
resource_id
,
Extract(month FROM Date(
usage_start_time)) AS MONTH,
Sum(cost) AS
sum_cost
FROM PUBLIC.billing_bigquery_data
INNER JOIN PUBLIC.conf_data_history
ON billing_bigquery_data.labels_value =
conf_data_history.resource_id
WHERE conf_data_history.metric_name IN( 'VOLUME_TYPE' )
AND labels_key IN( 'disk_id', 'instance_id' )
AND Extract(month FROM Date(usage_start_time)) =
'12'
GROUP BY conf_data_history.metric_value,
billing_bigquery_data.labels_value,
billing_bigquery_data.usage_start_time)AS test
GROUP BY month,
resource_id
ORDER BY resource_id) AS test
GROUP BY resource_id) tt
ORDER BY resource_id
解决方案
你可以试试这个。
SELECT resource_id,
100 * ( (MAX(avg)-MIN(avg)) / MAX(avg) )
FROM SampleTable
GROUP BY resource_id
如果比较是在当前月份和上个月之间。
SELECT resource_id,
100 * ( MAX(CASE WHEN RN = 1 THEN avg ELSE 0 END) - MAX(CASE WHEN RN = 2 THEN avg ELSE 0 END) )
/ MAX(CASE WHEN RN = 1 THEN avg ELSE 0 END)
FROM (
SELECT resource_id, avg, ROW_NUMBER() OVER(PARTITION BY resource_id ORDER BY month desc) RN FROM SampleTable
) AS T
group by resource_id
推荐阅读
- ios - 领域整合
- c# - 在制作对象池时需要帮助
- html - 如何使用仅使用 css 和 html 的换行符来实现打字机效果?
- python - 从多个网址(使用beautifulsoup)中提取标题和表格正文到数据框
- python - 在python中快速解析具有规则结构的可变长度行
- python - 我定义了我的功能,但它不会运行。为什么不?
- java - 将 Redis 与 spring 或 spring boot 一起使用时,默认的缓存策略是什么?
- javascript - 如何在多个事件上运行一个函数?
- c# - 如何将相机夹在鼠标 Y 轴上?
- javascript - 当图像以角度加载时显示加载图标