使用递归SQL命令而不使用递归(如SQL3)
我有这些桌子: 人员(pid、姓名、电子邮件、电话、城市) 骑乘(rid、pid、日期、地点、开始、目标)[rideID、personID-提供骑乘的人,地点=骑乘中的开放时段,开始和目标是目的地] 参与(pid,rid)-pid参与骑乘rid的人员 我必须满足函数(k) 慷慨度排名是由该人提供的乘车次数决定的。 我必须根据这个定义找到第K个慷慨的用户(可能不止一个),如果列表上的人数少于K,则返回NULL使用递归SQL命令而不使用递归(如SQL3),sql,postgresql,Sql,Postgresql,我有这些桌子: 人员(pid、姓名、电子邮件、电话、城市) 骑乘(rid、pid、日期、地点、开始、目标)[rideID、personID-提供骑乘的人,地点=骑乘中的开放时段,开始和目标是目的地] 参与(pid,rid)-pid参与骑乘rid的人员 我必须满足函数(k) 慷慨度排名是由该人提供的乘车次数决定的。 我必须根据这个定义找到第K个慷慨的用户(可能不止一个),如果列表上的人数少于K,则返回NULL 我曾考虑使用视图,但查询的递归性质让我不知所措 编辑:因为您使用的是PostgreSQL
我曾考虑使用视图,但查询的递归性质让我不知所措 编辑:因为您使用的是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提供了乘坐体验。
您将此数字检查为>=K,就可以设置了
重要:RowNum函数不会在每种类型的RDBMS上都起作用(它是针对Oracle的),但当然到处都有替换项(如LIMIT等)。如果有人参与骑乘,这算不算负?骑乘中的人是报价人/司机,参与的人是接受者/乘客?它不算作负数,我用的是PSQL,骑乘中的PID实际上是提供者,参与中的PID是乘客。好吧,你的公式似乎只需要骑乘表,因为参与表中的乘客不算,或者他们算吗?请定义GranousUsers()所基于的计算。我想你是对的,我们不需要参与表。我只需要找到第K个“慷慨”的用户。但是它给了我表的K值,我如何提取第K个用户(或者如果他们有相同的rankind,提取所有与第K个绑定的用户)。@JennyB哦,你只需要第K个吗?这并不难,我会在一分钟内编辑我的答案。@JennyB如果你想要一个以上的第k个用户,它会变得有点复杂。因为现在你突然需要把排名相同的人分组。意思是人们在第一个地点被绑等让我考虑一下。我还必须根据他们最早提供的乘坐日期对被绑的Kth用户进行排序,因此在数据库中提供最早日期的用户是在Kth地点被绑的人中的第一个。
Select pid From
(Select pid, count(*) as ranking
From Ride
Group By pid
Order By ranking desc)
Where Rownum < K
Select Count(*)
From (Select Distinct pid
From Ride)