【问题标题】:Return row of every n'th record返回每第 n 条记录的行
【发布时间】:2011-01-25 22:59:52
【问题描述】:

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

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

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 条记录,我将收到 30th60th90th em> 行。

如果我传入数字 40,并且结果集包含 90 条记录,我将收到 40th80th 行。

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

【问题讨论】:

  • 请注意,如果没有ORDER BY,您将获得随机顺序的结果,因此您不妨只限制第一个 N 个结果。
  • @Oli 谢谢,忘记添加了。结果将始终保持相同的顺序,并且永远不会改变。

标签: tsql sql-server-2008


【解决方案1】:

这就是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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 如果一行被删除大概这将不再起作用?
  • 谢谢,这个简单的解决方案适用于我的目的(我正在构建一个通用测试数据集,因此任何丢失的删除项目对我来说都不是问题)
  • 如果查询是用 WHERE 子句过滤的,这将无济于事,因为 ID 会随机跳跃。
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多