2017-02-27 7 views
0

Ich habe eine Tabelle wie unten gezeigt, und ich möchte wählen u_id mit Typ, aber wenn es mehr Datensätze für u_id dann möchte ich Datensatz, der best Typ hat, oder wenn es nicht da ist dann good und so weiter, best>good>worst so weit. Ich kann nur die erste Zeile für u_id erhalten, die zurückgegeben wird.Wählen Sie Datensatz nach Spalte Wert

u_id type 
1 best 
2 good 
3 worst 
2 best 

Antwort

3

Sie können dies mit row_number priorisieren und eine Zeile pro u_id wählen.

select u_id,type 
from (
select u_id,type, 
row_number() over(partition by u_id order by case when type='best' then 1 
                when type='good' then 2 
                when type='worst' then 3 
                else 4 end) as rn 
from tablename 
) t 
where rn=1 
+0

Dank, die – jemcaj

2
with type (n, type) as (values 
    (1, 'best'),(2,'good'),(3,'worst') 
) 
select distinct on (u_id) u_id, type 
from t inner join type using (type) 
order by u_id, n 
1

Sowohl die anderen Antworten sind wirklich gut. Dies ist eine Variante auf der distinct on Version, die keinen join erfordert:

select distinct on (u_id) u_id, type 
from t 
order by u_id, array_position(array[('best'), ('good'), ('worst')], type) 
+0

arbeitete ich bereits die „akzeptierte Antwort“ Methode verwendet, aber das sieht am einfachsten zu mir zu verstehen. – jemcaj

+0

Ich habe versucht, diesen Ansatz zu machen, denn wenn ich den Ansatz in der akzeptierten Antwort mache, dauert es 60 Mal länger, um meine Daten zu bekommen. Aber die Funktion array_position existiert nicht in postgreSQL – jemcaj

Verwandte Themen