Sql 删除重复行的值为空
这是数据Sql 删除重复行的值为空,sql,oracle,Sql,Oracle,这是数据 Id Name Value col1 col2 col3 1 test1 1 null null null 2 test1 1 x null null 3 test1 1 x y null 4 test2 2 x y z 5 test2 2 x y null 根据“名称”和“值”列查找重复项,并删除在更多列中具有空值的重复项 我通过以下方法成功地删除了重复项,但我不知道应该如何在SQL中实现这一点 预期
Id Name Value col1 col2 col3
1 test1 1 null null null
2 test1 1 x null null
3 test1 1 x y null
4 test2 2 x y z
5 test2 2 x y null
根据“名称”和“值”列查找重复项,并删除在更多列中具有空值的重复项
我通过以下方法成功地删除了重复项,但我不知道应该如何在SQL中实现这一点
预期结果
ID Name Value col1 Col2 Col3
3 test1 1 X y null
4 test2 2 x y z
Oracle安装程序:
CREATE TABLE table_name ( Id, Name, Value, col1, col2, col3 ) AS
SELECT 1, 'test1', 1, null, null, null FROM DUAL UNION ALL
SELECT 2, 'test1', 1, 'x', null, null FROM DUAL UNION ALL
SELECT 3, 'test1', 1, 'x', 'y', null FROM DUAL UNION ALL
SELECT 4, 'test2', 2, 'x', 'y', 'z' FROM DUAL UNION ALL
SELECT 5, 'test2', 2, 'x', 'y', null FROM DUAL;
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (
PARTITION BY name, value
ORDER BY DECODE( col1, NULL, 0, 1 )
+ DECODE( col2, NULL, 0, 1 )
+ DECODE( col3, NULL, 0, 1 ) DESC,
col1, col2, col3
) AS rn
FROM table_name t
)
WHERE rn = 1;
ID NAME VALUE C C C RN
---------- ----- ---------- - - - ----------
3 test1 1 x y 1
4 test2 2 x y z 1
查询:
CREATE TABLE table_name ( Id, Name, Value, col1, col2, col3 ) AS
SELECT 1, 'test1', 1, null, null, null FROM DUAL UNION ALL
SELECT 2, 'test1', 1, 'x', null, null FROM DUAL UNION ALL
SELECT 3, 'test1', 1, 'x', 'y', null FROM DUAL UNION ALL
SELECT 4, 'test2', 2, 'x', 'y', 'z' FROM DUAL UNION ALL
SELECT 5, 'test2', 2, 'x', 'y', null FROM DUAL;
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (
PARTITION BY name, value
ORDER BY DECODE( col1, NULL, 0, 1 )
+ DECODE( col2, NULL, 0, 1 )
+ DECODE( col3, NULL, 0, 1 ) DESC,
col1, col2, col3
) AS rn
FROM table_name t
)
WHERE rn = 1;
ID NAME VALUE C C C RN
---------- ----- ---------- - - - ----------
3 test1 1 x y 1
4 test2 2 x y z 1
输出:
CREATE TABLE table_name ( Id, Name, Value, col1, col2, col3 ) AS
SELECT 1, 'test1', 1, null, null, null FROM DUAL UNION ALL
SELECT 2, 'test1', 1, 'x', null, null FROM DUAL UNION ALL
SELECT 3, 'test1', 1, 'x', 'y', null FROM DUAL UNION ALL
SELECT 4, 'test2', 2, 'x', 'y', 'z' FROM DUAL UNION ALL
SELECT 5, 'test2', 2, 'x', 'y', null FROM DUAL;
SELECT *
FROM (
SELECT t.*,
ROW_NUMBER() OVER (
PARTITION BY name, value
ORDER BY DECODE( col1, NULL, 0, 1 )
+ DECODE( col2, NULL, 0, 1 )
+ DECODE( col3, NULL, 0, 1 ) DESC,
col1, col2, col3
) AS rn
FROM table_name t
)
WHERE rn = 1;
ID NAME VALUE C C C RN
---------- ----- ---------- - - - ----------
3 test1 1 x y 1
4 test2 2 x y z 1
有三列吗?或者这仅仅是一个例子?@WillemVanOnsem有10多个,我举了3个为例