Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从2个公用行中提取唯一值_Sql_Oracle_Performance_Query Optimization - Fatal编程技术网

Sql 从2个公用行中提取唯一值

Sql 从2个公用行中提取唯一值,sql,oracle,performance,query-optimization,Sql,Oracle,Performance,Query Optimization,有两行,其中一列有唯一的值,两列有非唯一的值,因为得到了两行,相反,如果我在第一列中有唯一的值,我需要一行 91285 X2 87681 X1 91285 C2 87682 X4 预期结果 91285 X2 87681 X1 87682 X4 或 我在oracle中尝试了分区切换,得到了预期的结果,但CPU对海量数据的需求急剧上升。有没有其他方法可以实现这一目标 SELECT id, type, ROW_NUMBER() OVER (PARTITION BY id

有两行,其中一列有唯一的值,两列有非唯一的值,因为得到了两行,相反,如果我在第一列中有唯一的值,我需要一行

91285   X2
87681   X1
91285   C2
87682   X4
预期结果

91285   X2
87681   X1
87682   X4

我在oracle中尝试了分区切换,得到了预期的结果,但CPU对海量数据的需求急剧上升。有没有其他方法可以实现这一目标

SELECT id, type, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id DESC) AS rn
FROM temp;
“CPU对海量数据的需求急剧上升”

您需要对结果集进行排序,以过滤掉那些不需要的行。如果结果集足够大,则该操作需要CPU,甚至可能需要文件I/O。这项工作无论如何都要做

也许使用聚合函数会更有效:

select id
       , max(type) as type
from temp
group by id;
这里的MAX()会给你X2除以C2,正如你的问题所问。如果您的实际业务逻辑更复杂,您可能需要一个不同的函数


temp(id,type)
上有一个复合索引会很有用。

如果您不担心在多行具有相同id的情况下选择哪种类型,可以使用ROWID检查性能

SELECT * FROM Table_test123 A
WHERE ROWID IN (SELECT MAX(ROWID) FROM Table_test123 B WHERE A.ID = B.ID);

当删除
C2
时,为
91285
保留
X2
的逻辑是什么?我已经给出了一个示例,X2或C2应该保留,一个应该放弃。
SELECT * FROM Table_test123 A
WHERE ROWID IN (SELECT MAX(ROWID) FROM Table_test123 B WHERE A.ID = B.ID);