[sql] SQL에서 무작위로 행을 선택하는 방법은 무엇입니까?

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;


답변

아마 이 사이트가 도움이 될 것입니다.

클릭 연결을 원하지 않는 사람들을 위해 :

SELECT TOP 1 column FROM table
ORDER BY NEWID()


답변

여기에는 멋진 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;