首页 > 解决方案 > 在“分组依据”之后,从特定列中的最大值中选择不为空的值

问题描述

我有一个TEST_RESULT表格,其中有一个测试结果作为一行。

version| test_id | test_result
---------------------------------------
v1     |   53    |     fail
v2     |   53    |     fail
v3     |   53    |     success
---------------------------------------
v1     |   60    |     unprocessable
v2     |   60    |     null
v3     |   60    |     null

53在 v1、v2 上测试失败,但v3已对其进行了修补并因此成功。测试60unprocessablev1在以后的版本v2v3.

我想摆脱的决赛桌看起来像这样:

test_id | final_result
---------------------------------------
53      |   success
60      |   unprocessable

final_resulttest_result如果值不为空,test_result将显示来自最高版本的值。如果值为 null,它将显示下一个最高版本,依此类推。(请注意,无论版本是否有测试结果,它总是有版本行)。

我能够给具有相同test_idusing的行排序ROW_NUMBER(),但是有点迷失了我们如何实现“test_result尽可能高的版本中的非空值”部分。这样的逻辑更适合在后端代码中实现吗?我想不出适合此的 SQL 运算符。

SELECT
 test_id,
 ROW_NUMBER() OVER (PARTITION BY test_Id ORDER BY version DESC) AS row_num
FROM TEST_RESULT
GROUP BY test_id

标签: sqlhana

解决方案


您可以使用窗口函数。关键是将测试结果与值放在值之前NULL

SELECT tr.*
FROM (SELECT tr.*,
             ROW_NUMBER() OVER (PARTITION BY test_Id ORDER BY (case when test_result IS NOT NULL then 1 else 2 end), version DESC) AS seqnum
      FROM TEST_RESULT tr
     ) tr
WHERE seqnum = 1;

请注意,这会返回test_Id表中的所有 s,即使是所有结果都是 的那些NULL


推荐阅读