说我有一个看起来像这样的表
df.select($"col1.*").rdd.map(x=> (x.getAs[Integer]("x1"), x.getAs[Double]("x2"))).collect.toList
//List((10,5.5), (7,2.1))
如果按姓,名排序,则我希望行号的顺序为ID:4、3、1、2。
我的问题是我选择了一行,并将其返回给应用程序。然后,我希望能够根据该用户ID进行排序,以根据相同的顺序获取下一行。
因此,如果我进行第一次选择,并且返回ID为4,我希望能够查询sql以按顺序(3)获取下一个用户。
我尝试的SQL语句将是
Users
---------------------
ID | LastName | FirstName
1 | Hane | Aaron
2 | Messi | Dennis
3 | Abraham | Dont
4 | Abraham | Carrey
但这不仅不起作用(最后一个sql语句将始终返回1,因为我显然正在过滤整个查询...)似乎它多次执行相同的逻辑,并且如果我理解正确的话order by将解析整个表,这会非常慢,因为数据集变得非常大。
是否有一种方法可以有效地实现我想做的事情(或根本不做?),我只想向前滚动,如果可能的话,最后换行(所以ID 4,3,1,2,4 ,3,1,2等)。
谢谢
答案 0 :(得分:1)
使用CTE:
WITH cte AS (
select *, ROW_NUMBER() over (order by [LastName], [FirstName]) as RowNum
from [Users]
)
SELECT TOP 1 *
FROM cte
WHERE RowNum > (SELECT RowNum FROM cte WHERE ID=4)
ORDER BY RowNum ASC
答案 1 :(得分:1)
不必每次都想要下一个用户都对数据库进行调用,而是为什么不对数据库进行一次调用来获得N
个用户(取决于表的大小,可以是所有用户或子集)。然后,提供API的应用程序将自行处理循环,而不必多次调用数据库以一次仅获得一条记录。