如何根据我提供的数字参数从子查询中返回每个第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条记录,我会收到 30th , 60th 和 90th row。
如果我传入数字40,结果集包含90条记录,我会收到 40th 和 80th 行。
作为旁注,对于背景信息,这用于捕获分页控件的每个第n条记录的密钥/ id。
答案 0 :(得分:56)
这是ROW_NUMBER
可以提供帮助的地方。它需要一个order-by子句,但这是可以的,因为存在order-by(并且需要保证特定的顺序)。
SELECT t.id, t.key
FROM
(
SELECT id, key, ROW_NUMBER() OVER (ORDER BY key) AS rownum
FROM datatable
) AS t
WHERE t.rownum % 30 = 0 -- or % 40 etc
ORDER BY t.key
答案 1 :(得分:9)
您不必使用行号,任何整数字段都可以。在大多数表中,我们有一个自动编号字段。为简单起见,我将其称为ID。要显示每第13条记录:
Select ID, LastName, FirstName FROM Users WHERE ID%13 = 0 ORDER BY ID
答案 2 :(得分:1)
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