2016-03-23 8 views
2

where句の後にcaseを使用することはできますか?以下は私の質問です。WHERE句内の別名とケース

おかげで、

select unit_id, law_id, risk, count(risk) as crr 
          from schema.table1 
          group by unit_id, law_id, risk 
      order by crr desc, risk desc 

結果

unit_id |law_id | risk  | crr 
---------------------------------- 
| 1 | 3  |Significant| 3 
| 1 | 3  |Limited | 3 
| 3 | 2  |Significant| 1 
| 1 | 1  |Significant| 1 
| 2 | 2  |Medium  | 1 
| 1 | 3  |Critical | 1 

と私はそれらをランク付け

select unit_id, law_id, a.risk, 
          rank() OVER (PARTITION BY unit_id, law_id ORDER BY crr DESC, risk DESC) as rank 
      from (select unit_id, law_id, risk, count(risk) as crr 
          from schema.table1 
          group by unit_id, law_id, risk 
      order by crr desc, risk desc        
      ) a 

結果

unit_id |law_id | risk  | rank 
---------------------------------- 
| 1 | 1  |Significant| 1 
| 1 | 3  |Significant| 1 
| 1 | 3  |Limited | 2 
| 1 | 3  |Critical | 3 
| 2 | 2  |Medium  | 1 
| 3 | 2  |Significant| 1 

私は以下の検索結果を得ています。上記の結果があれば、すべてのランクを1にしてランク1を無視し、クリティカル(ランクが何であれ)を取得したい。 私は以下のような結果を得たいと思います。

select unit_id, law_id, risk FROM     
      (select unit_id, law_id, a.risk, 
          rank() OVER (PARTITION BY unit_id, law_id ORDER BY crr DESC, risk DESC) as rank 
      from (select unit_id, law_id, risk, count(risk) as crr 
      from schema.table1 group by unit_id, law_id, risk 
      order by crr desc, risk desc  
      ) a )b WHERE rank = 1 or risk = 'Critical' 

実際の結果

unit_id |law_id | risk  
---------------------------- 
| 1 | 1  |Significant 
| 1 | 3  |Significant 
| 1 | 3  |Critical 
| 2 | 2  |Medium  
| 3 | 2  |Significant 

期待される成果

unit_id |law_id | risk  
---------------------------- 
| 1 | 1  |Significant 
| 1 | 3  |Critical 
| 2 | 2  |Medium  
| 3 | 2  |Significant 

答えて

1

RANK()ORDER BYCASE EXPRESSIONを使用してみてください:

select unit_id, law_id, risk FROM     
      (select unit_id, law_id, a.risk, 
        rank() OVER (PARTITION BY unit_id, law_id 
            ORDER BY CASE WHEN risk = 'Critical' then 1 else 0 end DESC, crr DESC, risk DESC) as rank 
      from (select unit_id, law_id, risk, count(risk) as crr 
      from schema.table1 group by unit_id, law_id, risk 
      order by crr desc, risk desc  
      ) a )b WHERE rank = 1 

criticalは最初に1位にランク付けされ、残りはロジックによってランク付けされます。

+0

多くのありがとうサギ。それは働いている – Taz

+0

問題はありません:) @ Taz – sagi