4

我需要从一组中选择示例行。例如,如果我的选择查询返回 x 行,那么如果 x 大于 50 ,我只希望返回 50 行,但不仅是前 50 行,还有 50 行,它们均匀分布在结果集中。本例中的表格记录路线 - GPS 位置 + 日期时间。我在 DateTime 上订购,需要一个合理的纬度和经度值样本。提前致谢 [SQL Server 2008]

4

4 回答 4

3

要在 SQL Server 中获取示例行,请使用以下查询:

SELECT TOP 50 * FROM Table
ORDER BY NEWID();

如果您想获取每第 n 行(在本例中为第 10 行),请尝试以下查询:

SELECT * From 
(
  SELECT  *, (Dense_Rank() OVER (ORDER BY Column ASC)) AS Rank 
  FROM Table
) AS Ranking 
WHERE Rank % 10 = 0; 

资源

可以在此处找到为其他流行的 RDBMS 选择随机行的更多查询示例:http ://www.petefreitag.com/item/466.cfm

于 2010-06-20T11:00:23.283 回答
3

每第 n 行获得 50:

SELECT *
FROM table
WHERE row_number() over() MOD (SELECT Count(*) FROM table) / 50 == 0
FETCH FIRST 50 ROWS ONLY

如果您想要一个随机样本,请使用 jimmy_keen 的答案。

更新:关于它在 MS SQL 上运行的要求,我认为它应该改为这个(虽然没有 MS SQL Server 来测试):

  SELECT TOP 50 *
   FROM (
     SELECT t.*, row_number() over() AS rn, (SELECT count(*) FROM table) / 50 AS step
     FROM table t
   )
   WHERE rn % step == 0
于 2010-06-20T11:00:32.357 回答
1

我建议您在作为随机数获得的选择结果集中添加一个计算列,然后选择按该列排序的前 50 个。这会给你一个随机样本。

例如:

SELECT TOP 50 *, RAND(Id) AS Random
FROM SourceData
ORDER BY Random

其中 SourceData 是您的源数据表或视图。顺便说一下,这假设 SQL Server 2008 上的 T-SQL。它还假设您的数据源上有一个具有唯一 ID 的 Id 列。如果您的 id 是非常小的数字,最好在将它们传递给 RAND 之前将它们乘以一个大整数,如下所示:

RAND(Id * 10000000)
于 2010-06-20T10:54:45.997 回答
0

如果您想要一个静态正确的样本,tablesample 是一个错误的解决方案。我在此处根据 Microsoft Research 论文描述的一个好的解决方案是在您的表上创建一个物化视图,其中包括一个附加列,如 CAST(ROW_NUMBER() OVER (...) AS BYTE) AS RAND_COL_,然后您可以在该列以及其他有趣的列上添加索引,并相当快地为您的查询获取统计上正确的样本。(通过使用 WHERE RAND_COL_ = 1)。

于 2011-06-08T02:47:52.523 回答