2017-08-22 62 views
0

我想從名爲names的表中選擇namenametype,但優先於nametypehive sql從優先條件表中選擇

table names 

name  nametype address id 
simon   01  xx   1 
simon   02  xx   2 
simon   03  xx   3 
karen   01  xx   4 
william   03  xx   5 
william   01  xx   6 
william   02  xx   7 

我想編寫與選擇name查詢要麼nametype = 01或02或03,在排序順序。 我只想要nametype = 01的行,其他2行不應該選擇 。

我怎樣才能在sql中實現這一點,我需要找出如何標記已選擇的名稱。

+2

請出示你想要的結果。還解決了這個問題。據推測,「banetype」實際上是「nametype」。 –

回答

0

管理弄明白用我的自我凝聚

pseudocode: 

if nametypes = OECD207 
    select row 
elseif nametypes = OECD203 
    select row 
elseif nametypes =OECD204 
    select row 
end if 

OECD207 OECD203 OECD204 ... 作爲優先級列表

select 
navn 
, coalesce(OECD207, OECD203, OECD204, ...) as nametype 
from 
(
select 
navn 
, max(case when nametype = "OECD207" then nametype else null end) as OECD207 
, max(case when nametype = "OECD203" then nametype else null end) as OECD203 
, max(case when nametype = "OECD204" then nametype else null end) as OECD204 
... 
from ... 
group by 
navn 
) 
1

如果你只想與01行,然後使用where

select t.* 
from t 
where t.nametype = '01'; 

如果你想用的nametype最小值(這似乎是你的問題的意圖)行,然後使用窗口功能和where。一種方法是使用min()

select t.* 
from (select t.*, min(t.nametype) over (partition by name) as min_nametype 
     from t 
    ) t 
where nametype = min_nametype; 
+0

嗨戈登我的任務是,選擇名稱與nametype。我的任務是在(02,01,03)中選擇帶nametype的名稱,但只能選擇一次名稱。如果優先級列表是02,01,03,表示simon是否存在nametype 02選擇,或者如果存在nametype 01選擇,或者存在與03選擇。所以結果總是會導致只選擇一行或一個名稱。 – havmaage

+0

@havmaage。 。 。如果你的排序順序不是01,02,03,那麼你有一個不同的問題。我建議你問另一個問題,更詳細地描述你真正想完成的事情。 –