2016-03-23 16 views
2

numaralı belgede, durumdan sonraki bir durumu kullanabilir. aşağıda benim sorgu.farklı ve WHERE tümcesinde

sayesinde

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 

sonuç

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 

ve onlara

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 

sonuçları

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 
sıralanarak

Sorgularımda aşağıdaki sonuçları alıyorum. ama ben 1 olan tüm rütbeleri elde etmek ve 1'inci sırada görmezden gelmek ve yukarıdaki sonuçlardan herhangi biri varsa Kritik (rütbe ne olursa olsun) almak istiyorum. Aşağıdaki gibi bir sonuç almak istiyorum.

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' 

gerçek sonuçlar

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

Beklenen Sonuçlar

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

cevap

1

RANK()ORDER BY yılında CASE EXPRESSION kullanmayı deneyin:

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 

O şekilde, critical ilk önce 1 olarak derecelendirilecek ve geri kalanı mantığınız tarafından sıralanacak.

+0

Çok teşekkürler Sagi. Çalışıyor – Taz

+0

Sorun değil :) @Taz – sagi