sql - 在“分组依据”之后,从特定列中的最大值中选择不为空的值
问题描述
我有一个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
已对其进行了修补并因此成功。测试60
在unprocessable
,v1
在以后的版本v2
和v3
.
我想摆脱的决赛桌看起来像这样:
test_id | final_result
---------------------------------------
53 | success
60 | unprocessable
final_result
test_result
如果值不为空,test_result
将显示来自最高版本的值。如果值为 null,它将显示下一个最高版本,依此类推。(请注意,无论版本是否有测试结果,它总是有版本行)。
我能够给具有相同test_id
using的行排序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
解决方案
您可以使用窗口函数。关键是将测试结果与值放在值之前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
。
推荐阅读
- python-pptx - python pptx PowerPoint幻灯片构建——理解模式/构建方法的麻烦
- html - 响应式表头未显示
- python - 如何使用蓝图在 Flask 中提供静态文件
- dialogflow-es - 服务器上的 Dialogflow 实体列表
- security - Nginx 处理 500 内部服务器错误安全问题
- python - 需要明确默认管道中的哪个组件会修改 Doc 上的 lemma_ 并需要有关提高 spacy 吞吐量的建议
- python - 子集生成算法的时间复杂度
- mysql - 如何查找两个日期和时间范围内的记录
- c# - @model int32 在 asp.net mvc 中做了什么?
- javascript - Angular-如何重复具有不同数据的组件?