MSSQL Server 2005를 사용하고 있습니다. 내 데이터베이스에는 “Id”와 “Name”이라는 두 개의 열과 약 2 개의 열이있는 “customerNames”테이블이 있습니다. 결과 1,000 개
매번 5 명의 고객을 무작위로 선택해야하는 기능을 만들고 있습니다. 누구나 쿼리를 실행할 때마다 임의의 5 행 (Id 및 Name)을 얻는 쿼리를 만드는 방법을 말해 줄 수 있습니까?
답변
SELECT TOP 5 Id, Name FROM customerNames
ORDER BY NEWID()
즉, 귀하의 질문에 대한보다 일반적인 답변을 얻으려면 모두이 페이지에 오는 것 같습니다.
SQL에서 임의의 행 선택
MySQL로 임의의 행을 선택하십시오.
SELECT column FROM table
ORDER BY RAND()
LIMIT 1
PostgreSQL로 임의의 행을 선택하십시오.
SELECT column FROM table
ORDER BY RANDOM()
LIMIT 1
Microsoft SQL Server에서 임의의 행을 선택하십시오.
SELECT TOP 1 column FROM table
ORDER BY NEWID()
IBM DB2로 임의의 행을 선택하십시오.
SELECT column, RAND() as IDX
FROM table
ORDER BY IDX FETCH FIRST 1 ROWS ONLY
Oracle에서 무작위 레코드를 선택하십시오.
SELECT column FROM
( SELECT column FROM table
ORDER BY dbms_random.value )
WHERE rownum = 1
sqlite로 임의의 행을 선택하십시오.
SELECT column FROM table
ORDER BY RANDOM() LIMIT 1
답변
SELECT TOP 5 Id, Name FROM customerNames ORDER BY NEWID()
답변
누군가가 PostgreSQL 솔루션을 원할 경우 :
select id, name
from customer
order by random()
limit 5;
답변
답변
여기에는 멋진 Microsoft SQL Server 2005 솔루션이 있습니다. 큰 결과 집합으로 작업하는 문제를 처리합니다 (내가 아는 질문은 아님).
큰 테이블에서 임의로 행 선택
http://msdn.microsoft.com/en-us/library/cc441928.aspx
답변
수백만 행의 테이블이 있고 성능에 관심이 있다면 더 나은 대답이 될 수 있습니다.
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM
(keycol1, NEWID())) as int))
% 100) < 10
https://msdn.microsoft.com/en-us/library/cc441928.aspx
답변
이것은 오래된 질문이지만 행 수가 많은 테이블에 새 필드 (NEWID () 또는 ORDER BY rand ())를 적용하려고하면 비용이 많이 듭니다. 증분적이고 고유 한 ID가 있고 (구멍이없는 경우) GUID를 적용하거나 모든 단일 행과 유사하고 상위 X #을 가져 오는 대신 선택할 X ID ID를 계산하는 것이 더 효율적입니다.
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;