忽略 SQL 中的空值
Ignore nulls in SQL
我正在使用 Oracle SQL,我需要一些查询方面的帮助。我有以下 table:
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_a
和 value_b
的最后加载值,它们不是 NULL。这是预期的输出 table:
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
请指教
我认为它会像聚合 MAX()
:
一样简单
SELECT time, type, MAX(value_a) AS value_a, MAX(value_b) AS value_b
FROM mytable
GROUP BY time, type;
如果 time
是 TIMESTAMP
那么您可能需要按 TRUNC(time, 'SS')
分组
您的测试数据表明 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(尽管该站点目前似乎已损坏)。
这可能仍然不是最正确的答案。这取决于实际数据。例如,当您在 TIME=11:00:39
处输入 TYPE=A
时会发生什么?
我正在使用 Oracle SQL,我需要一些查询方面的帮助。我有以下 table:
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_a
和 value_b
的最后加载值,它们不是 NULL。这是预期的输出 table:
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
请指教
我认为它会像聚合 MAX()
:
SELECT time, type, MAX(value_a) AS value_a, MAX(value_b) AS value_b
FROM mytable
GROUP BY time, type;
如果 time
是 TIMESTAMP
那么您可能需要按 TRUNC(time, 'SS')
您的测试数据表明 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(尽管该站点目前似乎已损坏)。
这可能仍然不是最正确的答案。这取决于实际数据。例如,当您在 TIME=11:00:39
处输入 TYPE=A
时会发生什么?