每个记录的返回行

时间:2011-01-25 22:59:53

标签: 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,并且子查询结果集包含90条记录,我会收到 30th 60th 90th row。

如果我传入数字40,结果集包含90条记录,我会收到 40th 80th 行。

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

3 个答案:

答案 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