Database 用最后一个_值()填充完整的行
首先我有这张桌子Database 用最后一个_值()填充完整的行,database,oracle,oracle11g,Database,Oracle,Oracle11g,首先我有这张桌子 CREATE TABLE tabla_1 (table_num NUMBER, amount NUMBER, first_name VARCHAR2(100), l_name VARCHAR2(100)); INSERT INTO tabla_1 (table_num, amount, first_name,l_name) VALUES (1,1,'Luis', 'Rosas'); INSERT INTO tabla_1 (table_num, amount, first_n
CREATE TABLE tabla_1
(table_num NUMBER, amount NUMBER, first_name VARCHAR2(100), l_name VARCHAR2(100));
INSERT INTO tabla_1 (table_num, amount, first_name,l_name) VALUES (1,1,'Luis', 'Rosas');
INSERT INTO tabla_1 (table_num, amount, first_name,l_name) VALUES (1,1,'Carlos','Borolas');
INSERT INTO tabla_1 (table_num, amount, first_name,l_name) VALUES (1,2,'Elena','Zeta');
INSERT INTO tabla_1 (table_num, amount, first_name,l_name) VALUES (1,null,null,null);
INSERT INTO tabla_1 (table_num, amount, first_name,l_name) VALUES (2,null,null,null);
commit;
对不起,这是西班牙语桌子,英语不是我的母语
问题是:
注意:在最后几行中,我有“N/A”,这是因为该值已插入空值。我不能在表上插入空值,至少我必须在空数字上插入-1,在空varchar2上插入'n/a',这已经用代码完成了
2.-如何将此空值替换为用户已知的上一个非空值
3.-最后的值或滞后哪个更好,我如何使用它?可以在整行中使用lag或last值?NVL+last\u值可能是一个选项:
SQL> select table_num,
2 nvl(amount, last_value(amount ignore nulls) over (order by table_num)) amount,
3 nvl(first_name, last_value(first_name ignore nulls) over (order by table_num)) first_name
4 from tabla_1;
TABLE_NUM AMOUNT FIRST_NAME
---------- ------ --------------------
1 1 Carlos
1 1 Luis
1 2 Elena
1 2 Elena
2 2 Elena
SQL>
如果样本数据显示没有空值,而是-1和N/A,那么用例:
这一点都不坏,但是我已经有了-1和'N/A'而不是表上的空值,可以调整您的查询吗?使用这个值而不是空值?那么使用用例。我添加了更多的代码;看一看
Expected result:
TABLE_NUM AMOUNT FIRST_NAME L_NAME
---------- ---------- ----------------------------------------------------------------------------- ---------------------------------------------------------------
1 1 Luis Rosas
1 1 Carlos Borolas
1 2 Elena Zeta
1 2 Elena Zeta
2 2 Elena Zeta
SQL> select table_num,
2 nvl(amount, last_value(amount ignore nulls) over (order by table_num)) amount,
3 nvl(first_name, last_value(first_name ignore nulls) over (order by table_num)) first_name
4 from tabla_1;
TABLE_NUM AMOUNT FIRST_NAME
---------- ------ --------------------
1 1 Carlos
1 1 Luis
1 2 Elena
1 2 Elena
2 2 Elena
SQL>
select table_num,
case when amount = -1 then last_value(amount ignore nulls) over (order by table_num)
else amount
end amount,
--
case when first_name = 'N/A' then last_value(first_name ignore nulls) over (order by table_num)
else first_name
end first_name
from tabla_1