27

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

表 A

人的语言...
鲍勃英语
约翰英语
弗拉德俄语
奥尔加俄语
何塞西班牙语

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

期望的结果

人的语言...
鲍勃英语
弗拉德俄语
何塞西班牙语

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

4

6 回答 6

47

Eric Petroelje 几乎是对的:

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

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

于 2009-06-11T20:35:44.563 回答
13

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

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;
于 2009-06-17T01:43:51.527 回答
9

我的 Oracle 有点生锈,但我认为这会起作用:

SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
于 2009-06-11T19:48:58.450 回答
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
于 2009-06-11T19:46:22.903 回答
0

为了提高效率,您只想像 Harper 那样访问数据一次。但是,您不想使用 rank() ,因为它会给您带来联系,并且您还想按语言分组而不是按语言排序。从那里你想添加一个 order by 子句来区分行,但你不想实际对数据进行排序。为了实现这一点,我会使用“order by null”,例如

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

于 2009-06-11T22:04:36.423 回答
0
select person, language     
from table A     
group by person, language  

将返回唯一的行

于 2011-07-15T20:23:40.120 回答