在Oracle 12.1和更高,这可以很容易地与match_recognize
子句完成的,这样的:
select user_id, email_address
from inputs
match_recognize (
partition by user_id
order by preferred_email desc nulls last
all rows per match
pattern (^x)
define x as 0 = 0
)
;
然而,这种解决方案(如以及其他一些人在这里提出的)有一个潜在的弱点:它依赖于明确的排序'Y'
vs 'N'
,并且它假设这些是preferred_email
列中唯一可能的值(并且该列不可为空)。
这将是更好,如果列preferred_email
并不受限于非可空,只可能值'Y'
和'N'
,有像
order by case preferred_email when 'Y' then 0 end [...]
不幸的是订单子句,match_recognize
子句只能按列顺序,而不是表达式。 (希望将来能够解决这个问题!)在这种情况下,使用FIRST/LAST聚合函数的集合解决方案(如MT0的答案)是最佳选择 - 但ORDER BY子句会相应更改。
select user_id,
max(email_address) keep (dense_rank first
order by case preferred_email when 'Y' then 0 end) as email_address
from inputs
group by user_id
;
那么,什么是所需的输出? [email protected]所有3个user_ids?或[email protected]分别为user_id#25和[email protected]和[email protected]分别为#26和#27? –
您使用的是哪个版本的Oracle?不同的版本附带不同的工具,可用于top-n(最大n组)问题。 – mathguy