2012-12-05 39 views
0

我有這些表:使用不使用遞歸遞歸SQL命令(如SQL3)

人(PID,姓名,電子郵件,電話,市)

騎(RID,PID,日期,地點,開始,目標)rideID,personID-誰提供的順風車,斑點=開放的插槽中馳騁,啓動和目標的人員有目的地]

參與(PID,去掉) - 人在PID乘坐參與擺脫

我必須滿足功能慷慨用戶(k)

慷慨排名是由人提供的遊樂設施數量定義的。 我必須通過此定義(可能有多個)找到第K個慷慨的用戶,或者如果列表中的K個人少於此人,則返回NULL。

我正在考慮使用VIEW,但查詢的遞歸性質讓我無能爲力。

+0

如果一個人參與乘坐,那麼計算減去? – Laurence

+0

ride中的personID是提供者/驅動程序,而參與的personID是acceptpter/passenger? – wildplasser

+1

哪個RDBMS是這個? – Bridge

回答

1

編輯:由於您使用PostgreSQL ROWNUM的等效應是能這樣使用ROW_NUMBER() :

Select pid From 
    (Select pid, count(*) as ranking, row_number() OVER (Order By ranking Desc) as Rownum 
    From Ride 
    Group By pid 
    Order By ranking desc) 
    Where Rownum < K 

最初的回答

如果您只需要他們的pid,然後你可以試試這個。

Select pid From 
(Select pid, count(*) as ranking 
From Ride 
Group By pid 
Order By ranking desc) 
Where Rownum < K 

這樣你就可以根據他們的排名得到K個第一個pid。 現在,如果你有少於K,你仍然會得到它們。 但取決於你正在開發的環境,你可以使用簡單的計數來檢查。

喜歡的東西

Select Count(*) 
From (Select Distinct pid 
    From Ride) 

你在哪裏得到了多少鮮明的PID已經提供一程。 你檢查這個數字是> = K並且你被設置了。

重要事項:RowNum函數不適用於每種類型的RDBMS(它適用於Oracle),但當然在任何地方都有替換(如LIMIT等)。

+0

但它給了我K值的表,我如何提取第K個人(或者他們有相同的rankind,提取所有綁定在Kth的人)。 –

+0

@JennyB哦,你只需要Kth?這不難,我會在一分鐘內編輯我的答案。 –

+0

@JennyB如果你想要多個第K個用戶,它會變得更復雜一些。因爲現在突然你需要將具有相同排名的人羣分組。意思是在第一個地點綁起來的人等等讓我想一想。 –