给定一个人的表A,他们的母语和其他列 C3 .. C10 由...表示
表 A
人的语言... 鲍勃英语 约翰英语 弗拉德俄语 奥尔加俄语 何塞西班牙语
如何构造一个查询,为每种不同的语言选择一行的所有列?
期望的结果
人的语言... 鲍勃英语 弗拉德俄语 何塞西班牙语
对我来说,每种不同语言的哪一行产生结果并不重要。在上面的结果中,我选择了每种语言的最低行号。
Eric Petroelje 几乎是对的:
SELECT * FROM TableA
WHERE ROWID IN ( SELECT MAX(ROWID) FROM TableA GROUP BY Language )
注意:使用 ROWID(行唯一 ID),而不是 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() 函数,然后只需拉出 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
为了提高效率,您只想像 Harper 那样访问数据一次。但是,您不想使用 rank() ,因为它会给您带来联系,并且您还想按语言分组而不是按语言排序。从那里你想添加一个 order by 子句来区分行,但你不想实际对数据进行排序。为了实现这一点,我会使用“order by null”,例如
count(*) over(按语言顺序按 null 分组)
select person, language
from table A
group by person, language
将返回唯一的行