SQL的滚动排序顺序

时间:2018-06-26 17:43:43

标签: sql sql-server

说我有一个看起来像这样的表

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

谢谢

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的应用程序将自行处理循环,而不必多次调用数据库以一次仅获得一条记录。