忽略SQL中的空值

时间:2015-03-08 10:34:04

标签: oracle null

我正在使用Oracle SQL,我需要一些查询帮助。我有下表:

Time     | Type | Value_A | Value_b | Loaded time sequence 
11:00:37 |   A  | Null    |  30     |      1
11:00:37 |   A  | 40      |  Null   |      2
11:00:37 |   B  | Null    |  20     |      3
11:00:37 |   B  | Null    |  50     |      4
11:00:38 |   C  | 50      |  Null   |      5
11:00:38 |   D  | Null    |  30     |      6
11:00:38 |   D  | 10      |  Null   |      7
11:00:38 |   D  | Null    |  5      |      8

对于每个Type,我想采用最后加载的Value_avalue_b值,这些值不是NULL。这是预期的输出表:

Time     | Type | Value_A | Value_b
11:00:37 |   A  | 40      |  30    
11:00:37 |   B  | Null    |  50    
11:00:38 |   C  | 50      |  Null    
11:00:38 |   D  | 10      |  5  

请告知。

2 个答案:

答案 0 :(得分:3)

您的测试数据表明TIME和TYPE是相互关联的,并且值始终会随时间而上升。在这种情况下,此解决方案将起作用:

select Time
       , Type
       , max(Value_A) as Value_A
       , max(Value_B) as Value_B
from your_table
group by Time
         , Type

但是,我认为您发布的数据不太具有代表性,因此您需要更复杂的解决方案。此解决方案使用LAST_VALUE()分析函数:

select distinct Time
       , Type
       , last_value(Value_A ignore nulls) 
           over (partition by time, type order by Loaded_time_sequence
                ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Value_A
       , last_value(Value_B ignore nulls) 
           over (partition by time, type order by Loaded_time_sequence
               ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) Value_B
from t23
;

这是the SQL Fiddle(虽然该网站目前似乎已被打破)。

这可能仍然不是最正确的答案。这取决于实际数据。例如,当您在TYPE=A处有TIME=11:00:39条目时会发生什么?

答案 1 :(得分:0)

我认为这与汇总MAX()

一样简单
SELECT time, type, MAX(value_a) AS value_a, MAX(value_b) AS value_b
  FROM mytable
 GROUP BY time, type;

如果timeTIMESTAMP,那么您可能希望按TRUNC(time, 'SS')分组