2012-09-18 34 views
0

如果我有表「members」(如下所示),我將如何獲取第一次出現membership_id(Oracle)的記錄。基於單列返回不同記錄的問題(Oracle)

預期結果

123     John      Doe      A  P 
313     Michael     Casey     A  A 
113     Luke      Skywalker    A  P 

表 - 會員

membership_id  first_name    last_name    status type 
123     John      Doe      A  P 
313     Michael     Casey     A  A 
113     Luke      Skywalker    A  P 
123     Bob      Dole      A  A 
313     Lucas      Smith     A  A 
+1

由於表中的行本質上是無序的,因此確定「第一個」的邏輯是什麼?爲了確定「第一」行,我們可以通過「ORDER BY」列確定哪些列?在你的例子中,它看起來像我們可以通過'last_name'命令,但我不確定這是否一般。 –

+0

訂單是根據membership_id和'type'(desc)確定的。我的例子顯然是按照這個順序,但這並沒有消除我遇到的問題。我程序中的數據實際上不是表格,而是已有查詢的結果。 – Blaine

回答

3
SELECT membership_id, 
     first_name, 
     last_name, 
     status, 
     type 
    FROM(SELECT membership_id, 
       first_name, 
       last_name, 
       status, 
       type, 
       rank() over (partition by membership_id 
           order by type desc) rnk 
      FROM members) 
WHERE rnk = 1 

將適用於您的示例數據集。如果你可以有關係 - 也就是說,多行具有相同的membership_id和相同的最大值type - 該查詢將返回所有這些行。如果您只想返回其中一條平行的行,則需要向order by添加其他條件以確保所有關係都被破壞,或者您需要使用row_number函數而不是rank,這將隨意破壞領帶。

0
Select A.* 
FROM Members AS A inner join 
    (Select membership_id, first(first_name) AS FN, first(last_name) AS LN 
     From Members 
     Group by membership_id) AS B 
    ON A.membership_id=B.membership_id and A.first_name=B.FN and A.last_name=B.LN 

希望幫助!

+0

'第一個'?就我所知,這不是Oracle的功能。你的意思是'max'或'min',它會選擇一個任意的組合(可能不是OP想要的嗎?) – Ben

+0

是的,你的權利,我沒有Oracle的經驗,所以我只是想指出一條可能的路徑。關於最大/最小的問題說:「獲得第一次出現membership_id(甲骨文)」的記錄,所以我認爲第一次出現是目標,但我可能誤解了。 – jpsfer

0
select * 
from members 
where rowid in (
    select min(rowid) 
    from members 
    group by membership_id 
)