2017-02-27 198 views
0

我有一個表格,如下所示,我想選擇u_id與類型,但如果有更多的記錄u_id那麼我想獲得有best類型的記錄,或者如果它不存在然後good等,best>good>worst到目前爲止。我只能得到返回的u_id的第一行。根據列值選擇記錄

u_id type 
1 best 
2 good 
3 worst 
2 best 

回答

3

您可以優先考慮row_number,併爲每個u_id選擇一行。

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

感謝那些工作 – 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

兩個其他的答案是非常好的。這是對distinct on版本的變種,不需要join

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

我已經使用了「接受的答案」的方法,但這個看起來最容易理解我。 – jemcaj

+0

我試圖這樣做,因爲如果我在接受的答案中採用這種方法,則需要60倍的時間來獲取我的數據。但是函數array_position在postgreSQL中不存在 – jemcaj