给定一个包含人员、他们的母语和其他列C3...C10的表A,请构造一个查询语句,以选择每种语言中一行的所有列。
表A
PERSON LANGUAGE ... bob 英语 john 英语 vlad 俄语 olga 俄语 jose 西班牙语
期望结果
PERSON LANGUAGE ... bob 英语 vlad 俄语 jose 西班牙语
对于我来说,每种语言中哪一行成为结果并不重要。在上面的结果中,我选择了每种语言最低的行号。
Eric Petroelje几乎就做对了:
SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
注意:使用ROWID(行唯一标识符),而不是ROWNUM(它给出结果集中的行号)
这样做会更有效率,并且您可以控制它用于选择值的顺序:
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;
我的Oracle有点生疏,但我认为这个方法可以解决问题:
SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
我会在子查询中使用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
select person, language
from table A
group by person, language
将返回唯一的行