给出一个表 A 的人,他们的母语和其他列C3 .. C10由 ...
表示PERSON LANGUAGE ... bob english john english vlad russian olga russian jose spanish
如何构建一个查询,为每种不同的语言选择一行的所有列?
PERSON LANGUAGE ... bob english vlad russian jose spanish
对我而言,每种不同语言的哪一行都能产生结果并不重要。在上面的结果中,我选择了每种语言的最低行号。
答案 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
将返回唯一的行