Oracle SQL,用最接近的非缺失填充缺失值

时间:2019-07-08 16:28:40

标签: sql oracle missing-data window-functions lag

我有一个数据集,我想用最接近的非缺失值来填充缺失值。我在this问题的答案中找到了两种优雅的解决方案,但我不明白为什么它们对我不起作用。

表格:

input.txt

尝试#1:

'use strict';

import React, { Component } from "react";
import { Text, View, TextInput, StyleSheet } from 'react-native';

class Home extends Component {

  constructor(props) {
    super(props);
    this.state = {
      name:''
      email:''
      nameError:''
      emailError:''
    };
  }

  onChangeText = name => text => this.setState({ [name]: text });

  render() {
    let { name, email, nameError, emailError } = this.state;

    return ( 
      <View style={styles.container}>
        <TextInput onChangeText={this._onChangeText("name")} value={name} />
        <Text style={styles.text}>{nameError}</Text>
        <TextInput onChangeText={this._onChangeText("email"} value={email} />
        <Text style={styles.text}>{emailError}</Text>
      </View>
    )
  }
}

const styles = StyleSheet.create({
  text: {
    padding: 10,
    fontSize: 42
  },
  container: {
    padding: 10
  }
});

export default Home;

尝试#2:

create table Tab1(data date, V1 number);
insert into Tab1 values (date '2000-01-01', 1);
insert into Tab1 values (date '2000-02-01', 1);
insert into Tab1 values (date '2000-03-01', 1);
insert into Tab1 values (date '2000-04-01', 1);
insert into Tab1 values (date '2000-05-01', NULL);
insert into Tab1 values (date '2000-06-01', NULL);
insert into Tab1 values (date '2000-03-01', 2);
insert into Tab1 values (date '2000-04-01', 2);
insert into Tab1 values (date '2000-05-01', NULL);
insert into Tab1 values (date '2000-06-01', NULL);
select * from Tab1;

DATA       V1
2000-01-01  1
2000-02-01  1
2000-03-01  1
2000-04-01  1
2000-05-01  
2000-06-01  
2000-03-01  2
2000-04-01  2
2000-05-01  
2000-06-01  

两者都会给我同样的不良结果:

select A.*, 
    (case when V1 is null then lag(V1 ignore nulls)  
               over (partition by V1 order by V1, data) 
          else V1 
          end) V2
 from Tab1 A;

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

您的第一个版本应该可以工作,但要稍作调整:

select A.*, 
       coalesce(V1, lag(V1 ignore nulls)  over (order by data)) V2
from Tab1 A;

调整是从partition by v1中删除lag()coalesce()只是我偏爱简单表达式的地方。

相同的调整也应适用于第二个版本。

您的版本不起作用,因为lag()值必须来自同一分区(或为null)。当您拥有partition by v1时,实际上是在确保v1与当前行具有相同的值。

答案 1 :(得分:0)

嗨,或者您可以尝试通过参考以下内容手动创建忽略空解决方案。谢谢https://stackoverflow.com/a/57016373/10562099

  1. 您需要使用0/1列来表示Null / Non-Null数据
  2. 然后在步骤1中创建累加汇总列以计算指标编号。-现在您可以看到数据已经看起来像按non_Null数据分组了。
  3. 最后一步,请使用一个Max函数组(在步骤2中)按累加总和将数据(此处为amont)填充为空项目。