0

我有这些表:

人(pid,姓名,电子邮件,电话,城市)

Ride(rid,pid,date,spots,start,target) [rideID, personID- 提供乘车的人,spots= 乘车的空位,start 和 target 是目的地]

参与(pid,rid)- 人 pid 参与 Ride rid

我必须满足功能慷慨用户(k)

慷慨度排名由该人提供的游乐设施数量定义。我必须按照这个定义找到第 K 个慷慨的用户(可能不止一个),或者如果列表中的人少于 K,则返回 NULL。

我正在考虑使用 VIEW 但查询的递归性质让我一无所知。

4

1 回答 1

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 等)。

于 2012-12-05T11:50:30.070 回答