복붙노트

[SQL] 어떻게 무작위 SQL에서 행을 선택하려면?

SQL

어떻게 무작위 SQL에서 행을 선택하려면?

내 DB에 MSSQL 서버 2005을 사용하고, 나는 두 개의 열 "ID"와 "이름"과 약이있는 테이블 "customerNames"가. 1,000 결과.

나는 무작위 때마다 5 개 고객을 선택하는 가지고 기능을 만드는 오전. 쿼리가 실행될 때 사람마다 방법 5 행 무작위로 얻을 것이다 쿼리를 만드는 방법을 가르쳐 (ID, 그리고 이름) 할 수 있습니까?

해결법

  1. ==============================

    1.

    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
    
  2. ==============================

    2.

    SELECT TOP 5 Id, Name FROM customerNames ORDER BY NEWID()
    
  3. ==============================

    3.경우에는 누군가가 PostgreSQL의 솔루션을 원한다 :

    경우에는 누군가가 PostgreSQL의 솔루션을 원한다 :

    select id, name
    from customer
    order by random()
    limit 5;
    
  4. ==============================

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

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

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

    SELECT TOP 1 column FROM table
    ORDER BY NEWID()
    
  5. ==============================

    5.2005 특정 솔루션 여기에 좋은 마이크로 소프트 SQL 서버가있다. 당신은 큰 결과 집합 (안 내가 알고있는 질문)와 함께 작업하고있는 문제를 다루고있다.

    2005 특정 솔루션 여기에 좋은 마이크로 소프트 SQL 서버가있다. 당신은 큰 결과 집합 (안 내가 알고있는 질문)와 함께 작업하고있는 문제를 다루고있다.

    큰 테이블에서 무작위로 행 선택 http://msdn.microsoft.com/en-us/library/cc441928.aspx

  6. ==============================

    6.TABLENAME ORDER BY 임의 () LIMIT 5 SELECT * FROM;

    TABLENAME ORDER BY 임의 () LIMIT 5 SELECT * FROM;

  7. ==============================

    7.당신은 성능에 대한 행 및 관리에 수백만 테이블이있는 경우,이 더 나은 해답이 될 수 있습니다 :

    당신은 성능에 대한 행 및 관리에 수백만 테이블이있는 경우,이 더 나은 해답이 될 수 있습니다 :

    SELECT * FROM Table1
    WHERE (ABS(CAST(
      (BINARY_CHECKSUM
      (keycol1, NEWID())) as int))
      % 100) < 10
    

    https://msdn.microsoft.com/en-us/library/cc441928.aspx

  8. ==============================

    8.이것은 오래된 질문이지만, 엄청나게 비싼 것 많은 수의 행이있는 테이블에 새로운 필드 (중 NEWID () 또는 ORDER BY 랜드를 ())를 적용하려고 시도. 당신이 ID의 X 번호를 계산하는 것이 더 효율적입니다 증가, 고유 ID를 (어떤 구멍이없는) 경우 대신 모든 단일 행에 GUID 또는 이와 유사한을 적용하고 상단의 X 번호를 복용 선택할 수 있습니다.

    이것은 오래된 질문이지만, 엄청나게 비싼 것 많은 수의 행이있는 테이블에 새로운 필드 (중 NEWID () 또는 ORDER BY 랜드를 ())를 적용하려고 시도. 당신이 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와 랜드의 무리와 함께 #tempTable을 채우기로 볼 것 많은 행을 선택하고자한다면 다음 최소 - 최대 값 규모의 각 랜드 () 값을 사용하여 값. 그런 식으로 당신은 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;
    
  9. ==============================

    9.나는 빅 데이터에 가장 적합한이를 발견했다.

    나는 빅 데이터에 가장 적합한이를 발견했다.

    `SELECT TOP 1 Column_Name FROM dbo.Table TABLESAMPLE(1 PERCENT);`
    

    TABLESAMPLE (N ROWS) 또는 TABLESAMPLE (N %)은 임의 그러나 필요성 TOP을 추가 할 n은 정확한 샘플 크기를 얻는 것입니다.

    () NEWID를 사용하여 큰 테이블에 매우 느립니다.

  10. ==============================

    10.이 글에서 설명한 바와 같이, SQL 결과 집합 셔플하기 위해, 당신은 데이터베이스 관련 함수 호출을 사용해야합니다.

    이 글에서 설명한 바와 같이, SQL 결과 집합 셔플하기 위해, 당신은 데이터베이스 관련 함수 호출을 사용해야합니다.

    그래서, 가정 우리는 다음과 같은 데이터베이스 테이블이 있습니다 :

    노래 테이블에 다음과 같은 행 :

    | 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 쿼리를 실행하는 경우, 우리는 다음과 같은 결과 집합을 얻을려고하고있다 :

    | 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      |
    

    다음의 예에 의해 그림과 같이 SQL 서버에, 당신은 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) |
    

    다음의 예에 의해 예시 된 바와 같이 PostgreSQL을에, 당신은, 임의의 기능을 사용합니다 :

    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      |
    

    다음의 예에 의해 예시로 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            |
    
  11. ==============================

    11.당신이 큰 테이블을 사용하고 데이터의 10 %의 액세스하려는 경우,이 다음 명령을 실행 : 표 1 ORDER BY NEWID () FROM SELECT TOP 10 % *를;

    당신이 큰 테이블을 사용하고 데이터의 10 %의 액세스하려는 경우,이 다음 명령을 실행 : 표 1 ORDER BY NEWID () FROM SELECT TOP 10 % *를;

  12. from https://stackoverflow.com/questions/580639/how-to-randomly-select-rows-in-sql by cc-by-sa and MIT license