SQL에서 행을 무작위로 선택하는 방법
MSSQL Server 2005를 사용하고 있습니다.제 db에는 "Customer Names" 테이블이 있으며, 두 개의 열 "Id"와 "Name"과 약 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
Postgre를 사용하여 임의의 행을 선택합니다.SQL:
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()
누군가 포스트그레를 원할 경우SQL 솔루션:
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 TOP 1 Column_Name FROM dbo.Table TABLESAMPLE(1 PERCENT);
TABLESAMPLE(n ROWS) or TABLESAMPLE(n PERCENT)
만, 「불필요」를 가 있습니다.TOP n
정확한 샘플 크기를 얻습니다.
「」를 사용합니다.NEWID()
큰 테이블에서는 매우 느립니다.
이것은 오래된 질문이지만 행 수가 많은 테이블에 새 필드(NEWID() 또는 ORDER BY rand())를 적용하려고 하면 비용이 많이 듭니다.증분 고유 ID가 있는 경우(구멍이 없는 경우) 모든 행에 GUID 또는 이와 유사한 ID를 적용하여 상위 X 번호를 선택하는 대신 선택하는 ID의 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() 값을 사용하여 min-max 값으로 스케일링합니다.이렇게 하면 모든 @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;
수백만 개의 행이 있는 테이블에서 퍼포먼스를 중시하는 경우, 이것이 더 좋은 답이 될 수 있습니다.
SELECT * FROM Table1
WHERE (ABS(CAST(
(BINARY_CHECKSUM
(keycol1, NEWID())) as int))
% 100) < 10
https://msdn.microsoft.com/en-us/library/cc441928.aspx
SELECT * FROM TABLENAME ORDER BY random() LIMIT 5;
SQL 결과 세트를 셔플하려면 데이터베이스 고유의 함수 호출을 사용해야 합니다.
RANDOM 함수를 사용하여 큰 결과 세트를 정렬하면 속도가 매우 느려질 수 있으므로 작은 결과 세트에 대해 정렬해야 합니다.
큰 결과 세트를 섞고 나중에 제한해야 하는 경우 Oracle이나
TABLESAMPLE
SQL Server 또는 Postgre에서ORDER BY 절의 임의 함수 대신 SQL을 사용합니다.
다음과 같은 데이터베이스 테이블이 있다고 가정합니다.
은요?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 |
오라클
해야 .DBMS_RANDOM.VALUE
하다
SELECT
artist||' - '||title AS song
FROM song
ORDER BY DBMS_RANDOM.VALUE
앞서 언급한 SQL 쿼리를 Oracle에서 실행하면 다음과 같은 결과 세트가 생성됩니다.
| 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
Server에서는 Server를 .NEWID
하다
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY NEWID()
앞서 말한 SQL 쿼리를 SQL Server에서 실행하면 다음과 같은 결과 세트를 얻을 수 있습니다.
| 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로 주문합니다.
포스트그레스Ql
에서는 SQL을 .random
하다
SELECT
artist||' - '||title AS song
FROM song
ORDER BY random()
Postgre에서 전술한 SQL 쿼리를 실행하는 경우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
MySQL을 .RAND
하다
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY RAND()
앞서 말한 SQL 쿼리를 MySQL에서 실행하면 다음과 같은 결과 세트를 얻을 수 있습니다.
| 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%에합니다.「 」 、 「 」 、 「 10% 」 、 「 」SELECT TOP 10 PERCENT * FROM Table1 ORDER BY NEWID();
Yandex 데이터베이스를 사용하는 경우,
select column from table order by random (TableRow()) limit 1;
「 를 합니다.NEWID()
키 은 " " " 입니다.int
그럼 다음과 같이 임의의 프라이머리 키를 선택할 수 있습니다.
with a as
(
select count(id) as row_count
from mytable
)
select *
from mytable , a
where id = round(rand() * row_count, 0)
언급URL : https://stackoverflow.com/questions/580639/how-to-randomly-select-rows-in-sql
'programing' 카테고리의 다른 글
Visual Studio에서 생성된 Windows 서비스 설치 (0) | 2023.04.23 |
---|---|
키보드가 입력 필드를 덮는 경우에만 보기 위로 이동 (0) | 2023.04.23 |
VBA에서 일부 시트 셀 데이터 옆에 프로그래밍 방식으로 버튼을 추가하는 방법은 무엇입니까? (0) | 2023.04.18 |
ItemsControl DataTemplate에서 캔버스 속성 설정 (0) | 2023.04.18 |
Git에서 처음 두 개의 커밋을 뭉개시겠습니까? (0) | 2023.04.18 |