Tsql 返回每个n'的行;第次记录

Tsql 返回每个n'的行;第次记录,tsql,sql-server-2008,Tsql,Sql Server 2008,如何根据我提供的数字参数从子查询返回每N条记录 例如,我可能有以下查询: SELECT Id, Key FROM DataTable WHERE CustomerId = 1234 ORDER BY Key 例如 子查询结果可能如下所示: Row Id Key 1 1 A3231 2 43 C1212 3 243 E1232 4 765 G1232 5 2432 E2325 ... 90 3193 F2312 如果我传入数字30,并且子查询

如何根据我提供的数字参数从子查询返回每N条记录

例如,我可能有以下查询:

SELECT
   Id,
   Key
FROM DataTable
WHERE CustomerId = 1234
ORDER BY Key
例如

子查询结果可能如下所示:

Row Id   Key
1   1    A3231
2   43   C1212
3   243  E1232
4   765  G1232
5   2432 E2325
...
90  3193 F2312
如果我传入数字30,并且子查询结果集包含90条记录,我将收到第30、60和90行

如果我传入数字40,结果集包含90条记录,我将收到第40行和第80行

作为旁注,对于背景信息,这用于捕获分页控件的每个第n条记录的键/id。

这是可以提供帮助的地方。它需要一个ORDERBY子句,但这是可以的,因为存在ORDERBY(并且需要保证特定的订单)


您不必使用行号,任何整数字段都可以。在大多数表上,我们都有一个自动编号字段。为简单起见,我将其命名为ID。以显示每13条记录:

Select ID, LastName, FirstName FROM Users WHERE ID%13 = 0 ORDER BY ID

请注意,如果没有按排序,您将以随机顺序获得结果,因此您最好只限于前N个结果。@谢谢,忘记添加了。结果的顺序将始终相同,并且永远不会更改。@pst:
行数
窗口函数不是专有的TSQL扩展。这是SQL标准的一部分(我相信是从SQL2003开始的)。看起来如果删除一行,这可能就不起作用了?谢谢,这个简单的解决方案适合我的目的(我正在构建一个通用测试数据集,所以我不必担心任何丢失的删除项)若使用WHERE子句过滤查询,那个么ID将随机跳起,这并没有帮助。
Select ID, LastName, FirstName FROM Users WHERE ID%13 = 0 ORDER BY ID
Select B.name 
from (Select row_number() over (order by ordering) as row_num, 
      A.name 
      from (Select name,'P1' as ordering 
            from [dbo].[every_2nd_record]
           ) A
      ) B
where B.row_num%2=0