如何在Oracle SQL中从结果中选择唯一记录?

时间:2020-11-02 04:53:09

标签: sql oracle group-by distinct

我正在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的第一行。如果结果多次包含相同的flow_id,则它应仅显示第一个flow_id的结果,而忽略第二个和第三个中的任何内容。

EXPECTED OUTPUT - 

200162  ABCWS1
200148  ABCWS3

您能帮我修改查询吗?

预先感谢您!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

除非列指定了该信息,否则没有“第一”行。

但是您可以轻松地将聚合用于此目的:

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

如果要做有指定顺序的列,您仍然可以使用聚合。 Oracle中“第一”功能的等效项是:

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
相关问题