在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