如何从 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 的方法~ 谢谢
如何从 X 列中选择唯一列,但从 SQL 的结果中显示 X + Y 列?
如何在 Oracle SQL 中不使用 distinct 选择从多个 max(case when) 派生的唯一行