2016-03-23 15 views
2

kann ich einen Fall nach der WHERE-Klausel verwenden. unten ist meine Abfrage.distinct und Fall innerhalb WHERE-Klausel

Danke,

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 

Ergebnisse

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 

und wenn ich sie Rang

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 

Ergebnisse

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 

Ich bekomme die folgenden Ergebnisse mit meiner Abfrage. aber ich möchte alle Ränge, die 1 sind, und Ignorieren Rang 1 und Critical (was auch immer der Rang ist), wenn es von oben Ergebnisse gibt. Ich möchte die Ergebnisse erhalten, die wie folgt sind.

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' 

tatsächlichen Ergebnisse

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

Erwartete Ergebnisse

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

Antwort

1

Versuchen CASE EXPRESSION im RANK()ORDER BY mit:

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 

That So wird die critical zuerst als 1 eingestuft, und der Rest wird nach Ihrer Logik geordnet.

+0

Vielen Dank Sagi. Es funktioniert – Taz

+0

Kein Problem :) @Taz – sagi