2017-11-01 6 views
1

グループ内の最大値を確認しようとしています。グループに存在する場合は最大値を特定します - Oracle SQL

私はMaxとMin機能を試していました。 しかし、私は最大を得ることができません、より大きいものがある場合に限ります、それらがすべて同じであれば、何もしたくありません。

予期される結果: 例1

OWNER ACCOUNT MONEY isMAX 
Admin account1 1000 YES 
Admin account2 500 NO 
Admin account3 300 NO 

予期される結果: 例2

OWNER ACCOUNT MONEY isMAX 
Admin account1 500  
Admin account2 500  
Admin account3 500  

予期される結果: 例3

OWNER ACCOUNT MONEY isMAX 
Admin account1 500 YES 
Admin account2 500 YES 
Admin account3 300 NO 

私はMAX、MINおよびCASE機能で遊んでいます。このような

答えて

1

これはそれを行う必要があります。

SQL Fiddle

クエリ1

SELECT 
    t1.OWNER, 
    t1.money, 
    CASE 
     WHEN t1.money = t2.ma AND t1.money > T2.mi 
     THEN 'YES' 
     WHEN t1.money < T2.ma 
     THEN 'NO' 
     ELSE '' 
    END AS isMAX 
FROM t t1 
INNER JOIN (
     SELECT OWNER, max(money) ma, min(money) mi 
     FROM t 
     GROUP BY OWNER 
    ) t2 
    ON t1.OWNER = t2.OWNER 

order by owner, ismax desc 

Results

| OWNER | MONEY | ISMAX | 
|--------|-------|--------| 
| Admin1 | 1000 | YES | 
| Admin1 | 500 |  NO | 
| Admin1 | 500 |  NO | 
| Admin2 | 500 | (null) | 
| Admin2 | 500 | (null) | 
| Admin2 | 500 | (null) | 
| Admin3 | 500 | YES | 
| Admin3 | 500 | YES | 
| Admin3 | 300 |  NO | 
+0

ありがとう、私はあなたを愛しています:D それは完全に動作します。^_ ^ –

0

何か:

select t.*, 
     (case when min(money) over (partition by owner, account) = 
        max(money) over (partition by owner, account) 
      then NULL 
      when money = max(money) over (partition by owner, account) 
      then 'YES' 
      else 'NO' 
     end) as isMax 
from t; 
+0

小規模な質問Gordon、over over by by partition byと単純な 'join max group by 'の違いを知っていますか?私は通常、サブクエリとの結合にまっすぐ行くと、パーティションの機能について少し忘れてしまったので好奇心が強いです... – Blag

+0

@Blag。 。 。ほとんどのデータベースでは、ウィンドウ関数は 'join'や' group by'よりも優れたパフォーマンスを持っています。 –

関連する問題