选择语句,表格样本,平均分配

时间:2012-02-29 04:42:25

标签: sql sql-server sql-server-2008

我们假设有一个SQL Server 2008表,如下所示,它拥有1000万行。 其中一个字段是Id,因为它的身份是1到1千万。

CREATE TABLE dbo.Stats
(
   id      INT IDENTITY(1,1) PRIMARY KEY,
   field1  INT,
   field2  INT,
   ...
)

通过执行一个select语句来获取满足以下要求的数据子集是否有效:

  • 在结果集中包含有限数量的行,即100,200等
  • 提供某个列的相等分布,而不是随机的,即列id

因此,在我们的示例中,如果我们返回100行,结果集将如下所示:

Row 1 - 100 000
Row 2 - 200 000
Row 3 - 300 000
...
Row 100 - 10 000 000

我想避免使用游标并将其存储在单独的表中。

2 个答案:

答案 0 :(得分:2)

不确定效率将如何,但是以下查询将返回每第100000行(相对于id建立的排序):

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY id) RN
    FROM Stats
) T
WHERE RN % 100000 = 0
ORDER BY id

由于它不依赖于实际的id值,即使您在id值的序列中有“漏洞”,这也会有效。

答案 1 :(得分:1)

这样的东西?

SELECT id FROM dbo..Stats WHERE id % 100000 = 0

它应该可以工作,因为你说id从1到10 000 000.如果行数不知道,但结果行的数量是你所知道的,那么只计算那个100000的数字(如果你愿意的话)比如100个结果行:

SELECT id FROM Stats WHERE (id % (SELECT COUNT(id) FROM Stats) / 100) = 0