2017-08-31 4 views
0

以下のルールに基づいて、ユーザーあたり1つのメールアドレスを選択します。 preferred_emailがYの場合は、そのメールアドレス([email protected])を選択します。 preferred_emailがYでない場合は、そのメールアドレスを使用します。 一部のユーザーはpreferred_emailの値がNである場合があります。 case文を使用しようとしましたが、正しい結果が返されませんでした。ユーザーごとに1つのメールアドレスを選択

これはテーブルの例です。オラクル12.1以降で

user_id email_address  preferred_email 
25  [email protected] N 
25  [email protected] Y 
26  [email protected] N 
27  [email protected] N 
+0

希望の出力は何ですか? 3つすべてのuser_idsの[email protected]?または、user_id#25の場合は[email protected]、次にそれぞれ#26と#27の場合は[email protected]と[email protected]ですか? –

+0

使用しているOracleのバージョンは?異なるバージョンには、トップn(1グループあたり最大)の質問に使用できるさまざまなツールが付属しています。 – mathguy

答えて

2
SELECT user_id, 
     MAX(email_address) KEEP (DENSE_RANK FIRST ORDER BY preferred_email DESC, ROWNUM) 
     AS email_address 
FROM your_table 
GROUP BY user_id 

又は

SELECT user_id, 
     email_address 
FROM (
    SELECT t.*, 
     ROW_NUMBER() OVER (PARTITION BY user_id 
          ORDER BY preferred_email DESC, ROWNUM) 
      AS rn 
    FROM your_table t 
) 
WHERE rn = 1; 
+0

どちらの解決方法でも 'ORDER BY'節に' ROWNUM'は必要ありません。少なくとも1つの優先メールアドレスがある場合、それらの中の本質的にランダムなものが選択され(ORDER BY句では 'ROWNUM'を伴ってまたは伴わずに)選択され、そうでなければ、それらの全てから本質的にランダムなアドレスが選択される。 'max(email_address)'はこの文脈ではランダムとほとんど同じです。 – mathguy

0

、これは次のように、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 
) 
; 

しかし、この解決策(ASここに提案されている他のものも同様)は、潜在的な弱点を持っています。具体的な順序は、'Y''N'であり、これらがpreferred_email列で可能な唯一の値であると仮定しています(また、その列はNULL可能ではありません)。

preferred_emailは残念ながら

order by case preferred_email when 'Y' then 0 end [...] 

のような順序句を持つように、非NULL可能とのみ可能な値'Y''N'に拘束されていない場合には、列によってmatch_recognize句できる唯一のため、良いだろう表現ではなく、この場合、MT0の回答のように、FIRST/LAST集合関数を使用する集計ソリューションが最適ですが、それに応じて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 
; 
関連する問題