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 所有行及其排名。根据每个测试的最新提交日期,我只想要每个测试的最后一行。

我找到了一种方法,将问题分成两部分

  1. 找到每个测试的最新提交日期
  2. 根据每个测试的最新提交日期使用 where 子句缩小结果范围

从这个 SO 答案中得到了帮助: 做的事情非常相似

  1. 创建查询以获取每个测试的最新提交日期 - 这仍将输出所有行,但现在每个测试的最新提交日期将保持不变。
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. 将 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 条记录的摘要,其中包含最新提交日期并显示平均结果