我需要从一组中选择示例行。例如,如果我的选择查询返回 x 行,那么如果 x 大于 50 ,我只希望返回 50 行,但不仅是前 50 行,还有 50 行,它们均匀分布在结果集中。本例中的表格记录路线 - GPS 位置 + 日期时间。我在 DateTime 上订购,需要一个合理的纬度和经度值样本。提前致谢 [SQL Server 2008]
4 回答
要在 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
每第 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
我建议您在作为随机数获得的选择结果集中添加一个计算列,然后选择按该列排序的前 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)
如果您想要一个静态正确的样本,tablesample 是一个错误的解决方案。我在此处根据 Microsoft Research 论文描述的一个好的解决方案是在您的表上创建一个物化视图,其中包括一个附加列,如 CAST(ROW_NUMBER() OVER (...) AS BYTE) AS RAND_COL_,然后您可以在该列以及其他有趣的列上添加索引,并相当快地为您的查询获取统计上正确的样本。(通过使用 WHERE RAND_COL_ = 1)。