每个记录的返回行

Geo*_*ton 37 t-sql sql-server-2008

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

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

SELECT
   Id,
   Key
FROM DataTable
WHERE CustomerId = 1234
ORDER BY Key
Run Code Online (Sandbox Code Playgroud)

例如

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

Row Id   Key
1   1    A3231
2   43   C1212
3   243  E1232
4   765  G1232
5   2432 E2325
...
90  3193 F2312
Run Code Online (Sandbox Code Playgroud)

如果我通过在30号,子查询结果集包含90条记录,我就收到了第30,第60第90行.

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

作为旁注,对于背景信息,这用于捕获寻呼控制的每个第n条记录的密钥/ id.

Luk*_*keH 61

这是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
Run Code Online (Sandbox Code Playgroud)

  • @pst:`ROW_NUMBER`窗口函数不是专有的TSQL扩展.它是SQL标准的一部分(我相信自SQL2003以来). (2认同)

小智 11

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

Select ID, LastName, FirstName FROM Users WHERE ID%13 = 0 ORDER BY ID
Run Code Online (Sandbox Code Playgroud)

  • 如果删除一行可能会不再有效? (10认同)
  • 如果查询使用WHERE子句过滤,则ID会随机跳起,这无济于事。 (3认同)
  • 谢谢,这个简单的解决方案适用于我的目的(我正在构建一个通用的测试数据集,所以任何丢失的删除项目都不是我的关注) (2认同)