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

Ian*_*hen 22 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

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

小智 39

Eric Petroelje几乎是正确的:

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
Run Code Online (Sandbox Code Playgroud)

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

  • +1好抓! - 我已经离开Oracle世界太久了. (4认同)

Jef*_*emp 11

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

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language
               ORDER BY person)
      ,language
FROM   tableA;
Run Code Online (Sandbox Code Playgroud)

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

SELECT DISTINCT
       FIRST_VALUE(person)
          OVER(PARTITION BY language)
      ,language
FROM   tableA;
Run Code Online (Sandbox Code Playgroud)

  • 这是否也适用于选择其他几个列的第一个值?在我的问题中,我将这些称为“其他列 C3 .. C10 由 ... 表示”。谢谢! (2认同)
  • 是的。SELECT DISTINCT FIRST_VALUE(colA) OVER (PARTITION BY x), FIRST_VALUE(colB) OVER (PARTITION BY x), ... FROM tableA (2认同)

Eri*_*lje 7

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

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
Run Code Online (Sandbox Code Playgroud)