首页 > 解决方案 > 处理 Null 值或返回多个值的 Max 函数

问题描述

我在下面有 2 个表结构,我需要获得与特定事件的最大验证时间对应的结果。如果某个特定事件具有相同的 verify_dt_tm,我需要根据该特定事件的最大 result_id 来获取它。我在下面写了一个示例查询。它适用于非空值,但不适用于 NULL。我已将 COALESCE 用于 NULL 值,但这不起作用,因为外部查询仍会将 verify_dt_tm 作为它们不匹配的空广告。下面是表格的详细说明。

订单表

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

标签: sqloracleoracle-sqldeveloper

解决方案


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;

推荐阅读