【微信公众号:跟强哥学SQL】
在我们实际的数据处理工作中,有时需要从表中随机抽取数据进行分析。SQL 为我们提供了多种方法来实现这一需求。
下面我为大家详细介绍其中四种常见的抽样方法,并给出实际的例子。
方法一:使用 RAND() 函数
最直接的方法是使用 SQL 的 RAND() 函数对数据进行随机排序,然后取前 N 条。
基本语法如下:
SELECT *
FROM table_name
ORDER BY RAND()
LIMIT N;
RAND() 函数生成一个介于 0 到 1 之间的随机浮点数。通过 ORDER BY RAND() ,可以随机排序所有结果,然后使用 LIMIT N 取出前 N 条。
这种方法虽然简单易用,但在数据表行数较多时可能会导致执行效率下降。
使用示例:在 users 表中随机查找5个用户。
SELECT *
FROM users
ORDER BY RAND()
LIMIT 5
方法二:使用 NEWID() 函数
NEWID() 是 SQL Server 中用于生成唯一标识符的函数。它每次都会生成新的值,因此可以用来随机排序。
基本语法如下:
SELECT TOP(N) *
FROM table_name
ORDER BY NEWID();
NEWID() 和 RAND() 不同,它不会因为读取一次而改变它的输出值。
使用示例:在 users 表中随机查找5个用户。
SELECT TOP 5 *
FROM table_name
ORDER BY NEWID();
方法三:使用 TABLESAMPLE 组合函数
TABLESAMPLE 可以用于从表中随机选择指定比例的行。我们可以先使用 TABLESAMPLE 获取大致的比例,再使用 LIMIT 获取确切的数量。
基本语法如下:
SELECT * FROM table_name
TABLESAMPLE(10 PERCENT)
LIMIT N;
需要注意的是,这个方法并不能精准地选择 N 条数据,因为 TABLESAMPLE 的执行结果与表中实际数据量有关。
另外, TABLESAMPLE仅用于HIVE数据库。
使用示例:在 users 表中随机查找5个用户。
SELECT *
FROM users
TABLESAMPLE(10 PERCENT)
LIMIT 5;
方法四:使用 distribute by rand() + sort by rand()
在 Hive SQL 中,还可以使用 `distribute by rand()` ,再配合 `sort by rand()` 进行数据的随机抽样:
基本语法如下:
SELECT * FROM (
SELECT *, rand() as random
FROM table_name
DISTRIBUTE BY rand()
SORT BY rand()
) tmp
LIMIT N;
`distribute by rand()` 可以保证随机数的分布均匀,而 `sort by rand()` 则在均匀地基础上做排序,再用 LIMIT 就可以获得随机的N条数据了。
使用示例:在 users 表中随机查找5个用户。
SELECT * FROM (
SELECT *, rand() as random
FROM table_name
DISTRIBUTE BY rand()
SORT BY rand()
) tmp
LIMIT 5;
【微信公众号:跟强哥学SQL】