2016-11-04 6 views
1

ich eine Reihe von postgreSQL Daten, die in dem beigefügten Bild wie das aussieht (Pic1-Beispieldaten):Nicht in der Lage, die genauen PostgreSQL-Abfrage, um herauszufinden,

Pic 1-Sample Data

custom_field Spalt identifizieren würde, wenn die Zeileneintrag ist "Abteilung ID" oder "Hohe Priorität Rolle?" und die ersten sechs Ziffern der Spalte text_value geben die Abteilungscodes an. Wie Sie sehen können, ist der Wert in der Spalte "text_value" "Yes", wo immer das Feld "custom_field" die Rolle "Hohe Priorität" hat. Jetzt ist meine Anforderung, nur jene Aufzeichnungen zu extrahieren, in denen custom_field "hohe Priorität Rolle" ist. Das klingt sehr einfach, aber es sollte auch die 'Department ID' angehängt sein.

HINWEIS: job_id ist nicht eindeutig. Jede Job-ID, die der Rolle 'Hohe Priorität' entspricht? würde auch einen doppelten Eintrag haben, für den der Wert in custom_field 'Department ID' wäre (siehe angehängtes Bild 2 als Referenz).

Pic 2

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of- Code-auf-so-wenn-eine Frage zu stellen/285557 # 285557 –

Antwort

0

So etwas wie das?

select 
    a.*, 
    b.display_value as department 
from (
    select 
     * 
    from 
     <table> 
    where 
     custom_field = 'High Priority Role?' 
) a 
inner join 
    <table> b 
on 
    a.job_id = b.job_id 
where 
    b.custom_field != 'High Priority Role?' 
group by 
    a.job_id, 
    a.custom_field, 
    a.float_value, 
    a.date_value, 
    a.display_value, 
    a.text_value, 
    a.unit, 
    b.display_value 

Ich habe in MariaDB, nicht PostgreSQL getestet, aber es sollte funktionieren.

http://sqlfiddle.com/#!15/62ca4/3/0

0

Dies ist ein einfaches join:

select t.*, left(t2.text_value, 6) as department_id 
from t join 
    t t2 
    on t.job_id = t2.job_id and 
     t.custom_field = 'High Priority Role?' and 
     t2.custom_field <> 'High Priority Role?'; 

Dies setzt voraus, dass es mit der Abteilung ID genau eine passende Aufgabe.

Wenn es mehrere sind, dann für eine seitliche gehen beitreten:

select t.*, left(t2.text_value, 6) as department_id 
from t, lateral 
    (select t2.* 
     from t t2 
     where t.job_id = t2.job_id and 
      t.custom_field = 'High Priority Role?' and 
      t2.custom_field <> 'High Priority Role?' 
     fetch first 1 row only -- no `order by` because any match will do 
    ) t2; 
Verwandte Themen