我正在使用MSSQL Server2005。在我的数据库中,我有一个表“ customerNames”,其中有两列“ Id”和“ Name”以及大约。1,000个结果。
我正在创建一个功能,每次必须随机选择5个客户。谁能告诉我如何创建一个查询,该查询每次执行查询时都会随机获得5行(Id和Name)?
我正在使用MSSQL Server2005。在我的数据库中,我有一个表“ customerNames”,其中有两列“ Id”和“ Name”以及大约。1,000个结果。
我正在创建一个功能,每次必须随机选择5个客户。谁能告诉我如何创建一个查询,该查询每次执行查询时都会随机获得5行(Id和Name)?
Answers:
SELECT TOP 5 Id, Name FROM customerNames
ORDER BY NEWID()
也就是说,似乎每个人都可以访问此页面以获取对您的问题的更一般的答案:
SELECT column FROM table
ORDER BY RAND()
LIMIT 1
SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1
SELECT TOP 1 column FROM table
ORDER BY NEWID()
SELECT column, RAND() as IDX
FROM table
ORDER BY IDX FETCH FIRST 1 ROWS ONLY
SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1
SELECT column FROM table
ORDER BY RANDOM() LIMIT 1
update tbl_vouchers set tbl_UsersID = (select top(1) id from tbl_Users order by NEWID())
-编辑:我无法在注释中使用格式:(
这里有一个很好的Microsoft SQL Server 2005特定解决方案。处理您要处理较大结果集的问题(不是我所知道的问题)。
从大表中随机选择行 http://msdn.microsoft.com/zh-cn/library/cc441928.aspx
如果您有一个包含数百万行的表并关心性能,那么这可能是一个更好的答案:
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM
(keycol1, NEWID())) as int))
% 100) < 10
这是一个古老的问题,但是尝试将新字段(NEWID()或ORDER BY rand())应用于具有大量行的表将非常昂贵。如果您具有递增的唯一ID(并且没有任何漏洞),则计算要选择的X#ID而不是对每行应用GUID或类似的代码,然后取前X#会更有效。
DECLARE @minValue int;
DECLARE @maxValue int;
SELECT @minValue = min(id), @maxValue = max(id) from [TABLE];
DECLARE @randomId1 int, @randomId2 int, @randomId3 int, @randomId4 int, @randomId5 int
SET @randomId1 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId2 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId3 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId4 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
SET @randomId5 = ((@maxValue + 1) - @minValue) * Rand() + @minValue
--select @maxValue as MaxValue, @minValue as MinValue
-- , @randomId1 as SelectedId1
-- , @randomId2 as SelectedId2
-- , @randomId3 as SelectedId3
-- , @randomId4 as SelectedId4
-- , @randomId5 as SelectedId5
select * from [TABLE] el
where el.id in (@randomId1, @randomId2, @randomId3, @randomId4, @randomId5)
如果要选择更多行,我将研究使用ID和一堆rand()值填充#tempTable,然后使用每个rand()值缩放到最小-最大值。这样,您不必定义所有@ randomId1 ... n参数。我在下面提供了一个使用CTE填充初始表的示例。
DECLARE @NumItems int = 100;
DECLARE @minValue int;
DECLARE @maxValue int;
SELECT @minValue = min(id), @maxValue = max(id) from [TABLE];
DECLARE @range int = @maxValue+1 - @minValue;
with cte (n) as (
select 1 union all
select n+1 from cte
where n < @NumItems
)
select cast( @range * rand(cast(newid() as varbinary(100))) + @minValue as int) tp
into #Nt
from cte;
select * from #Nt ntt
inner join [TABLE] i on i.id = ntt.tp;
drop table #Nt;
正如我在本文中解释的,为了重新整理SQL结果集,您需要使用特定于数据库的函数调用。
请注意,使用RANDOM函数对大型结果集进行排序可能会非常缓慢,因此请确保对小型结果集执行此操作。
如果必须改组较大的结果集并在之后对其进行限制,那么最好使用Oracle
SAMPLE(N)
或SQL Server或PostgreSQL中的TABLESAMPLE
in 而不是ORDER BY子句中的随机函数。
因此,假设我们有以下数据库表:
以及song
表中的以下行:
| id | artist | title |
|----|---------------------------------|------------------------------------|
| 1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
| 2 | HAIM | Don't Save Me (Cyril Hahn Remix) |
| 3 | 2Pac ft. DMX | Rise Of A Champion (GalilHD Remix) |
| 4 | Ed Sheeran & Passenger | No Diggity (Kygo Remix) |
| 5 | JP Cooper ft. Mali-Koa | All This Love |
在Oracle上,您需要使用该DBMS_RANDOM.VALUE
功能,如以下示例所示:
SELECT
artist||' - '||title AS song
FROM song
ORDER BY DBMS_RANDOM.VALUE
在Oracle上运行上述SQL查询时,我们将获得以下结果集:
| song |
|---------------------------------------------------|
| JP Cooper ft. Mali-Koa - All This Love |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
请注意,由于
DBMS_RANDOM.VALUE
ORDER BY子句使用了函数调用,因此歌曲以随机顺序列出。
在SQL Server上,您需要使用该NEWID
功能,如以下示例所示:
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY NEWID()
在SQL Server上运行上述SQL查询时,我们将获得以下结果集:
| song |
|---------------------------------------------------|
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
| JP Cooper ft. Mali-Koa - All This Love |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
请注意,由于
NEWID
ORDER BY子句使用了函数调用,因此歌曲以随机顺序列出。
在PostgreSQL上,您需要使用该random
函数,如以下示例所示:
SELECT
artist||' - '||title AS song
FROM song
ORDER BY random()
在PostgreSQL上运行上述SQL查询时,我们将获得以下结果集:
| song |
|---------------------------------------------------|
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
请注意,由于
random
ORDER BY子句使用了函数调用,因此歌曲以随机顺序列出。
在MySQL上,您需要使用该RAND
函数,如以下示例所示:
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY RAND()
在MySQL上运行上述SQL查询时,我们将获得以下结果集:
| song |
|---------------------------------------------------|
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love |
请注意,由于
RAND
ORDER BY子句使用了函数调用,因此歌曲以随机顺序列出。
如果您使用的是大表并希望访问10%的数据,请运行以下命令: SELECT TOP 10 PERCENT * FROM Table1 ORDER BY NEWID();