programing

SQL에서 행을 무작위로 선택하는 방법

padding 2023. 4. 18. 21:50
반응형

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이나TABLESAMPLESQL Server 또는 Postgre에서ORDER BY 절의 임의 함수 대신 SQL을 사용합니다.

다음과 같은 데이터베이스 테이블이 있다고 가정합니다.

Song 데이터베이스 테이블

은요?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.VALUEORDER 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) |

은 '아예'의 '아예'에 의해 랜덤.NEWIDORDER 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      |

은 '아예'의 '아예'에 의해 랜덤.randomORDER 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            |

은 '아예'의 '아예'에 의해 랜덤.RANDORDER 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

반응형