sql - 处理 Null 值或返回多个值的 Max 函数
问题描述
我在下面有 2 个表结构,我需要获得与特定事件的最大验证时间对应的结果。如果某个特定事件具有相同的 verify_dt_tm,我需要根据该特定事件的最大 result_id 来获取它。我在下面写了一个示例查询。它适用于非空值,但不适用于 NULL。我已将 COALESCE 用于 NULL 值,但这不起作用,因为外部查询仍会将 verify_dt_tm 作为它们不匹配的空广告。下面是表格的详细说明。
- 订单表每个订单都有 1 个条目
- 一个订单可以有多个结果。例如,血液测试可以有嗜碱性粒细胞计数、单核细胞计数、淋巴细胞计数等,所以一个血液测试订单有 3 个或更多事件对应于我得到的结果。
订单表
order_id order_status
12345 Completed
结果表
result_table_id order_id event verified_dt_tm result_value
98765 12345 Basophils count 22/02/19 11:00 12
87654 12345 monocytes count 21/02/19 15:00 34
76543 12345 lymphocytes count 21/02/19 14:44 35
76542 12345 rbcytes count 35
76540 12345 rbcytes count 1
76532 12345 rbcytes count 3
98765 12345 Basophils count 22/02/19 10:00 12
87654 12345 monocytes count 21/02/19 11:00 34
76543 12345 lymphocytes count 21/02/19 11:44 35
所需输出
result_table_id order_id event verified_dt_tm result_value
98765 12345 Basophils count 22/02/19 11:00 12
87654 12345 monocytes count 21/02/19 15:00 34
76543 12345 lymphocytes count 21/02/19 14:44 35
76542 12345 rbcytes count 35
下面是示例查询。此外,任何关于更好查询的建议都非常受欢迎:
select o.order_id
,TO_CHAR(r_o.verified_dt_tm, 'DD-MON-YYYY HH24:MI:SS') as verified_dt_tm
,r_o.result_val as result
,r_o.result_table_id
,omf_get_cv_display(r_o.event_cd) as event
,omf_get_cv_display(o.ORDER_STATUS_CD) as order_status
from orders o
left outer join (select * from results r where r.event_cd > 0
and r.VERIFIED_DT_TM = (select max(COALESCE(r1.VERIFIED_DT_TM,to_date('12/31/2099','mm/dd/yyyy'))) from result r1 where r.ORDER_ID = r1.ORDER_ID
and r.EVENT_CD = r1.event_cd))r_o on r_o.ORDER_ID = o.order_id
解决方案
ROW_NUMBER
在这里应该是可行的:
WITH cte AS (
SELECT res.*,
ROW_NUMBER() OVER (PARTITION BY res.order_id, res.event
ORDER BY res.verified_dt_tm DESC, res.result_value DESC) rn
FROM orders o
INNER JOIN result res
ON o.order_id = r.order_id
)
SELECT *
FROM cte
WHERE rn = 1;
推荐阅读
- javascript - 将带有双引号和单引号的字符串作为参数传递给 javascript 函数
- sql - 如何将 hive 两个 hive 查询与 avg 和 max 函数结合起来?
- excel - 在 Excel 中以编程方式检测或删除 Worksheet_Deactivate 代码
- c++ - 对象的字段是否按顺序分配?
- haskell - 编写没有模式匹配的双递归函数
- docker - 在 jenkins 构建中使用 docker 镜像并启动后台服务
- c# - 将 Listview 行项目添加到数据库 C#
- android - 没有 ContextCompat 的 Android 请求权限
- operating-system - 集中式版本控制和分布式版本控制
- java - (Android) 对某个页面的操作 - webView