How to get summarized and ranked list of data in BigQuery - 根据排名将多行汇总为1
How to get summarized and ranked list of data in BigQuery - summarize many rows into 1 based on rank
我有一个 BigQuery 视图 (flow_test_metrics_level_1_moving_average
),可以跟踪不同测试的平均失败率。
SELECT test, commit_date2, result2, AVG(result2)
OVER (
PARTITION BY test
ORDER BY commit_date2
ROWS BETWEEN 4 PRECEDING AND CURRENT ROW
) AS avg_result
FROM `data.dev_src_flow_test_metrics.flow_test_metrics_level_1`
ORDER BY test
以下是从此视图返回的一些行:
这是有效的,我可以像这样在 Grafana 中可视化每个测试的数据:
我想创建一个新的可视化效果,根据每个测试的最新提交日期(commit_date2
字段),我可以在其中获得失败率最高的测试的汇总和排名列表。并非所有测试都具有相同的提交日期值。
Test1
的最后提交日期可能是 1 月 1 日,平均通过率为 0.90。
Test2
的最后提交日期可能是 1 月 2 日,平均通过率为 0.80。
Test3
的最后提交日期可能是 1 月 3 日,平均通过率为 0.85。
我想创建一个新视图显示如下排名(通过率从低到高):
Test2
(0.80)
Test3
(0.85)
Test1
(0.90)
我想创建一个 BigQuery 视图/table 来创建这个排名列表并且只使用每个测试的最新提交日期。
我尝试了以下 BigQuery 视图,但我得到了所有测试行,而不仅仅是基于提交日期的每个测试的最新行
SELECT test, avg_result, commit_date2,
RANK() OVER (PARTITION BY test ORDER BY avg_result desc) AS RANK
FROM `data.dev_src_flow_test_metrics.flow_test_metrics_level_1_moving_average`
ORDER BY commit_date2 desc
但是这 returns 所有行及其排名。根据每个测试的最新提交日期,我只想要每个测试的最后一行。
我找到了一种方法,将问题分成两部分
- 找到每个测试的最新提交日期
- 根据每个测试的最新提交日期使用 where 子句缩小结果范围
从这个 SO 答案中得到了帮助: 做的事情非常相似
- 创建查询以获取每个测试的最新提交日期 - 这仍将输出所有行,但现在每个测试的最新提交日期将保持不变。
SELECT test, avg_result, commit_date2,
FIRST_VALUE(commit_date2) OVER (PARTITION BY test ORDER BY commit_date2 DESC) as latest_commit_date
FROM `data.dev_src_flow_test_metrics.flow_test_metrics_level_1_moving_average`
- 将 1) 中的查询用作 sub-query,您可以在其中缩小结果以匹配每个测试名称,因此每个测试仅返回 1 条记录
SELECT test, avg_result, commit_date2
from (
SELECT test, avg_result, commit_date2,
FIRST_VALUE(commit_date2) OVER (PARTITION BY test ORDER BY commit_date2 DESC) as latest_commit_date
FROM `data.dev_src_flow_test_metrics.flow_test_metrics_level_1_moving_average`
)
WHERE commit_date2 = latest_commit_date
现在我们得到每个测试 1 条记录的摘要,其中包含最新提交日期并显示平均结果
我有一个 BigQuery 视图 (flow_test_metrics_level_1_moving_average
),可以跟踪不同测试的平均失败率。
SELECT test, commit_date2, result2, AVG(result2)
OVER (
PARTITION BY test
ORDER BY commit_date2
ROWS BETWEEN 4 PRECEDING AND CURRENT ROW
) AS avg_result
FROM `data.dev_src_flow_test_metrics.flow_test_metrics_level_1`
ORDER BY test
以下是从此视图返回的一些行:
这是有效的,我可以像这样在 Grafana 中可视化每个测试的数据:
我想创建一个新的可视化效果,根据每个测试的最新提交日期(commit_date2
字段),我可以在其中获得失败率最高的测试的汇总和排名列表。并非所有测试都具有相同的提交日期值。
Test1
的最后提交日期可能是 1 月 1 日,平均通过率为 0.90。
Test2
的最后提交日期可能是 1 月 2 日,平均通过率为 0.80。
Test3
的最后提交日期可能是 1 月 3 日,平均通过率为 0.85。
我想创建一个新视图显示如下排名(通过率从低到高):
Test2
(0.80)
Test3
(0.85)
Test1
(0.90)
我想创建一个 BigQuery 视图/table 来创建这个排名列表并且只使用每个测试的最新提交日期。
我尝试了以下 BigQuery 视图,但我得到了所有测试行,而不仅仅是基于提交日期的每个测试的最新行
SELECT test, avg_result, commit_date2,
RANK() OVER (PARTITION BY test ORDER BY avg_result desc) AS RANK
FROM `data.dev_src_flow_test_metrics.flow_test_metrics_level_1_moving_average`
ORDER BY commit_date2 desc
但是这 returns 所有行及其排名。根据每个测试的最新提交日期,我只想要每个测试的最后一行。
我找到了一种方法,将问题分成两部分
- 找到每个测试的最新提交日期
- 根据每个测试的最新提交日期使用 where 子句缩小结果范围
从这个 SO 答案中得到了帮助:
- 创建查询以获取每个测试的最新提交日期 - 这仍将输出所有行,但现在每个测试的最新提交日期将保持不变。
SELECT test, avg_result, commit_date2,
FIRST_VALUE(commit_date2) OVER (PARTITION BY test ORDER BY commit_date2 DESC) as latest_commit_date
FROM `data.dev_src_flow_test_metrics.flow_test_metrics_level_1_moving_average`
- 将 1) 中的查询用作 sub-query,您可以在其中缩小结果以匹配每个测试名称,因此每个测试仅返回 1 条记录
SELECT test, avg_result, commit_date2
from (
SELECT test, avg_result, commit_date2,
FIRST_VALUE(commit_date2) OVER (PARTITION BY test ORDER BY commit_date2 DESC) as latest_commit_date
FROM `data.dev_src_flow_test_metrics.flow_test_metrics_level_1_moving_average`
)
WHERE commit_date2 = latest_commit_date
现在我们得到每个测试 1 条记录的摘要,其中包含最新提交日期并显示平均结果