2017-06-08 3 views
0

ich eine einfache Abfrage, wie dieseOracle SQL: Manipulieren Gruppe

select duration, host from Jobs 
group by host; 

ich es will durch einen Pool von Hosts tatsächlich Gruppe, die etwas ist, das zum Zeitpunkt der Abfrage

beispielsweise definiert werden muss, , host01-10 wäre pool1, host11-20 wäre pool2, etc.

Momentan gibt es kein Feld, das sagt, in welchem ​​Pool es sich befindet und es muss vom Host-Feld abgeleitet werden.

Wie erreiche ich das? Ich möchte Schaffung der Lage sein, eine Art von Funktion auf der Folie, das Feld zu maniuplate, so dass sie gruppen der Lage ist,

def get_pool(host): 
    if get_hostnumber(host) < 10: 
     return 'pool1' 
    elif: 
     ... 

select duration, get_pool(host) from Jobs 
group by get_pool(host); 
+0

können Sie einige Beispieldaten zeigen, und die erwartete Ausgabe? –

Antwort

1

In SQL, Sie brauchen keine Funktion dafür. Ich würde vorschlagen, nur einen case Ausdruck mit:

select (case when host <= 'host10' then 'pool1' 
      when host <= 'host20' then 'pool2' 
      . . . 
     end) as hostgrp, sum(duration) as duration 
from jobs 
group by (case when host <= 'host10' then 'pool1' 
      when host <= 'host20' then 'pool2' 
      . . . 
     end); 

Für Ihr spezielles Beispiel könnten Sie weg mit:

select 'pool' || floor((cast(substr(host, 5, 6) as number) + 1)/10), 
     sum(duration) as duration 
from jobs 
group by 'pool' || floor((cast(substr(host, 5, 6) as number) + 1)/10); 

Und damit ich nicht vergessen, ich habe Sie eine dauerhafte Zuordnung zwischen Hosts und deren Gruppen, dann sollten Sie eine hosts Referenztabelle in der Datenbank setzen und eine zweite Spalte für die Gruppe haben. Dann würde diese Abfrage einfach eine join verwenden, und jede andere Abfrage, die Sie schreiben, würde die gleiche Information haben.

1

können Sie Fall verwenden, wenn in ausgewählten und in der Gruppe von:

select duration, (case when host <10 then 'pool1' when host between 10 and 19 then 'pool2') 
from Jobs 
group by (case when host <10 then 'pool1' when host between 10 and 19 then 'pool2');