Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用递归SQL命令而不使用递归(如SQL3)_Sql_Postgresql - Fatal编程技术网

使用递归SQL命令而不使用递归(如SQL3)

使用递归SQL命令而不使用递归(如SQL3),sql,postgresql,Sql,Postgresql,我有这些桌子: 人员(pid、姓名、电子邮件、电话、城市) 骑乘(rid、pid、日期、地点、开始、目标)[rideID、personID-提供骑乘的人,地点=骑乘中的开放时段,开始和目标是目的地] 参与(pid,rid)-pid参与骑乘rid的人员 我必须满足函数(k) 慷慨度排名是由该人提供的乘车次数决定的。 我必须根据这个定义找到第K个慷慨的用户(可能不止一个),如果列表上的人数少于K,则返回NULL 我曾考虑使用视图,但查询的递归性质让我不知所措 编辑:因为您使用的是PostgreSQL

我有这些桌子:

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

骑乘(rid、pid、日期、地点、开始、目标)[rideID、personID-提供骑乘的人,地点=骑乘中的开放时段,开始和目标是目的地]

参与(pid,rid)-pid参与骑乘rid的人员

我必须满足函数(k)

慷慨度排名是由该人提供的乘车次数决定的。 我必须根据这个定义找到第K个慷慨的用户(可能不止一个),如果列表上的人数少于K,则返回NULL


我曾考虑使用视图,但查询的递归性质让我不知所措

编辑:因为您使用的是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)