Oracle 11g SQL在多列查询的一列中获取唯一值

时间:2009-06-11 19:42:32

标签: sql oracle distinct

给出一个表 A 的人,他们的母语和其他列C3 .. C10由 ...

表示

表A

PERSON   LANGUAGE   ...
bob      english
john     english
vlad     russian
olga     russian
jose     spanish

如何构建一个查询,为每种不同的语言选择一行的所有列?

期望结果

PERSON   LANGUAGE   ...
bob      english
vlad     russian
jose     spanish

对我而言,每种不同语言的哪一行都能产生结果并不重要。在上面的结果中,我选择了每种语言的最低行号。

6 个答案:

答案 0 :(得分:37)

Eric Petroelje几乎是正确的:

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )

注意:使用ROWID(行唯一ID),而不是ROWNUM(它给出结果集中的行号)

答案 1 :(得分:10)

这样会更有效率,而且您可以控制用于选择值的顺序:

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language
               ORDER BY person)
      ,language
FROM   tableA;

如果你真的不在乎为每种语言挑选哪个人,你可以省略ORDER BY子句:

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language)
      ,language
FROM   tableA;

答案 2 :(得分:7)

我的Oracle有点生疏,但我认为这样可行:

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )

答案 3 :(得分:2)

我在子选择中使用RANK()函数,然后只拉出rank = 1的行。

select person, language
from
( 
    select person, language, rank() over(order by language) as rank
    from table A
    group by person, language
)
where rank = 1

答案 4 :(得分:0)

为了效率,你想要只打一次数据,就像Harper那样。但是,您不想使用rank(),因为它会为您提供关联,并且您希望按语言分组而不是按语言排序。从那里你想要添加一个order by子句来区分行,但你不想实际排序数据。为实现这一目标,我将使用“by null by null”,例如

count(*)over(按语言顺序分组为空)

答案 5 :(得分:0)

select person, language     
from table A     
group by person, language  

将返回唯一的行