如何从 oracle SQL 的结果中选择唯一记录?

Posted

技术标签:

【中文标题】如何从 oracle SQL 的结果中选择唯一记录?【英文标题】:How to select unique records from a result in oracle SQL? 【发布时间】:2021-02-14 18:42:18 【问题描述】:

我在 oracle 数据库上运行 SQL 查询。

SELECT   DISTINCT flow_id , COMPOSITE_NAME  FROM CUBE_INSTANCE where flow_id IN(200148,
200162);

我得到的结果如下。

200162  ABCWS1
200148  ABCWS3
200162  ABCWS2
200148  OutputLog
200162  OutputLog

在此结果中 200162 出现三次,因为每个结果中的复合名称都不同。但我的要求是只获得第一行 200162 的第一行。如果 result 多次包含相同的 flow_id 则它应该只显示第一个 flow_id 的结果并忽略它在第 2 和第 3 中的任何内容。

EXPECTED OUTPUT - 

200162  ABCWS1
200148  ABCWS3

您能帮我修改查询吗?

提前谢谢你!!!

【问题讨论】:

定义“第一个 flow_id”。 “第一”意味着某种排序,但您没有告诉我们您想要什么排序。你想要composite_name 按字母顺序排在第一位的那一行吗? Oracle 数据在表中是无序 - 正如@JustinCave 所指出的,您需要在查询中定义某种排序顺序。此外,“DISTINCT”关键字适用于结果集中的 所有 列,而不仅仅是第一个 - 每个返回的 row 都是唯一的,而不仅仅是第一列的值。 【参考方案1】:

您似乎想为每个flow_id 取字典序上的第一个复合名称:

WITH cte AS (
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY flow_id ORDER BY COMPOSITE_NAME) rn
    FROM CUBE_INSTANCE t
    WHERE flow_id IN (200148, 200162)
)

SELECT flow_id, COMPOSITE_NAME
FROM cte
WHERE rn = 1;

【讨论】:

您好,它工作正常,但是如何使用 select 语句将所有内容放在单个查询中。我对此感到困惑。 其实我的答案已经是一个单一的查询。如果您要问的是如何避免使用 CTE,只需内联它:SELECT flow_id, COMPOSITE_NAME FROM (SELECT t.*, ROW_NUMBER() ... ) t WHERE rn = 1 谢谢....!!!它正在按照我的要求工作...... @KushalKaria 欢迎来到 Stack Overflow。如果此答案解决了您的问题,请考虑接受,方法是单击答案左侧的绿色复选标记。【参考方案2】:

没有“第一”行之类的东西,除非一列指定了该信息。

但您可以轻松地为此目的使用聚合:

select ci.flow_id, min(ci.composite_name)
from cube_instance ci
where flow_id in (200148, 200162);
group by ci.flow_id

如果您确实有一个指定排序的列,您仍然可以使用聚合。 Oracle 中“first”函数的等价物是:

select ci.flow_id,
       min(ci.composite_name) keep (dense_rank first order by <ordering col>)
from cube_instance ci
where flow_id in (200148, 200162);
group by ci.flow_id

【讨论】:

以上是关于如何从 oracle SQL 的结果中选择唯一记录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQL SEVER 查询结果中,选择前10条记录,或者前10%的记录,等等,不要ACCESS,OR ORACLE 的方法~ 谢谢

SQL - oracle - 如何从连接结果中选择特定部门

如何从 X 列中选择唯一列,但从 SQL 的结果中显示 X + Y 列?

如何在 Oracle SQL 中不使用 distinct 选择从多个 max(case when) 派生的唯一行

如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果

如何连接具有选择性重复记录的表? (oracle10g)