복붙노트

[SQL] 어떻게 2005 SQL Server에서 열로 임의의 숫자를 반환합니까?

SQL

어떻게 2005 SQL Server에서 열로 임의의 숫자를 반환합니까?

내가 SQL 서버 2005 SQL 쿼리를 실행하고있어, 2 열뿐만 아니라 데이터베이스에서 조회되는, 나 또한 그들과 함께 임의의 숫자의 1 열을 반환하는 것처럼. 나는이 시도 :

select column1, column2, floor(rand() * 10000) as column3 
from table1

좀 작동하지만, 문제는이 쿼리는 모든 행에서 같은 난수를 반환된다. 그것은 다른 번호 쿼리를 실행할 때마다, 그러나 그것은 행에서 행으로 변화하지 않습니다. 어떻게 이렇게 각 행에 대한 새로운 난수를받을 수 있나요?

해결법

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

    1.나는 이것이 이전 게시물입니다 실현 ...하지만 당신은보기가 필요하지 않습니다.

    나는 이것이 이전 게시물입니다 실현 ...하지만 당신은보기가 필요하지 않습니다.

    select column1, column2, 
      ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 10000 as column3 
    from table1
    
  2. ==============================

    2.경고

    경고

    보기를 포함 아담의 대답은 매우 비효율적이고 매우 큰 세트는 아주 잠시 동안 데이터베이스를 취할 수, 나는 강력하게 정기적으로 또는 생산에 큰 테이블을 채우는 데 필요한 상황에서 사용하기에 추천 할 것입니다.

    대신 당신이 대답을 사용할 수 있습니다.

    증명:

    CREATE VIEW vRandNumber
    AS
    SELECT RAND() as RandNumber
    
    go 
    
    CREATE FUNCTION RandNumber()
    RETURNS float
    AS
      BEGIN
      RETURN (SELECT RandNumber FROM vRandNumber)
      END
    
    go 
    
    create table bigtable(i int)
    
    go 
    
    insert into bigtable 
    select top 100000 1 from sysobjects  a
    join sysobjects b on 1=1
    
    go 
    
    select cast(dbo.RandNumber() * 10000 as integer) as r into #t from bigtable 
    -- CPU (1607) READS (204639) DURATION (1551)
    
    go
    
    select ABS(CAST(CAST(NEWID() AS VARBINARY) AS int)) % 10000 as r  into #t1 
    from bigtable
    -- Runs 15 times faster - CPU (78) READS (809) DURATION (99)
    

    프로파일 러 추적 :

    대체 텍스트 http://img519.imageshack.us/img519/8425/destroydbxu9.png

    이 물건은 0 ~ 9999 번호에 대한 임의 충분이 있다는 증거입니다

    -- proof that stuff is random enough 
    select avg(r) from #t
    -- 5004
    select STDEV(r) from #t
    -- 2895.1999 
    
    select avg(r) from #t1
    -- 4992
    select STDEV(r) from #t1
    -- 2881.44 
    
    
    select r,count(r) from #t
    group by r 
    -- 10000 rows returned 
    
    select r,count(r) from #t1
    group by r 
    -- 10000 row returned 
    
  3. ==============================

    3.접수 나는 그것을 표시 그래서 아담의 대답은 정말 잘 작동합니다. 그래도 난 대답을 기다리는 동안, 나는 또한 몇 가지 다른 (약간 덜 랜덤) 방법이 블로그 항목을 발견했다. Kaboing의 방법은 그들 중 하나였습니다.

    접수 나는 그것을 표시 그래서 아담의 대답은 정말 잘 작동합니다. 그래도 난 대답을 기다리는 동안, 나는 또한 몇 가지 다른 (약간 덜 랜덤) 방법이 블로그 항목을 발견했다. Kaboing의 방법은 그들 중 하나였습니다.

    http://blog.sqlauthority.com/2007/04/29/sql-server-random-number-generator-script-sql-query/

  4. ==============================

    4.

    select RAND(CHECKSUM(NEWID()))
    
  5. ==============================

    5.당신은 UDF를 사용할 필요가

    당신은 UDF를 사용할 필요가

    먼저:

    CREATE VIEW vRandNumber
    AS
    SELECT RAND() as RandNumber
    

    둘째:

    CREATE FUNCTION RandNumber()
    RETURNS float
    AS
      BEGIN
      RETURN (SELECT RandNumber FROM vRandNumber)
      END
    

    테스트:

    SELECT dbo.RandNumber(), *
    FROM <table>
    

    제프의 ​​SQL 서버 블로그에서 빌린 위

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

    6.SQLServer를 들어, 몇 가지 옵션이 있습니다. 1. 루프는 한 번에 하나 개의 임의의 숫자와 빈 열을 업데이트하는 동안 기능을 포함 2. .NET 어셈블리가 반환 임의의 숫자

    SQLServer를 들어, 몇 가지 옵션이 있습니다. 1. 루프는 한 번에 하나 개의 임의의 숫자와 빈 열을 업데이트하는 동안 기능을 포함 2. .NET 어셈블리가 반환 임의의 숫자

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

    7.당신은 NEWID 함수를 사용하여 임의의 숫자 대신 UUID를 생성 고려하실 수 있습니다. 이 일부 중복 간단한 난수로 발생하는 중요한 기회가있는 반면 생성 할 때마다 고유성을 보장받을 수 있습니다 (그리고 당신이 그것을 사용하는지에 따라서 나중에에서 디버그 오류로 phenominally 하드 당신을 줄 수)

    당신은 NEWID 함수를 사용하여 임의의 숫자 대신 UUID를 생성 고려하실 수 있습니다. 이 일부 중복 간단한 난수로 발생하는 중요한 기회가있는 반면 생성 할 때마다 고유성을 보장받을 수 있습니다 (그리고 당신이 그것을 사용하는지에 따라서 나중에에서 디버그 오류로 phenominally 하드 당신을 줄 수)

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

    8.NEWID () 나는 많은 자원 믿습니다. 나는 몇 백만 레코드 테이블에 그 방법을 시도 불러 성능은하지 거의 좋은 같은 랜드로 ()이었다.

    NEWID () 나는 많은 자원 믿습니다. 나는 몇 백만 레코드 테이블에 그 방법을 시도 불러 성능은하지 거의 좋은 같은 랜드로 ()이었다.

  9. ==============================

    9.내 테스트에 따르면, 대답은 위의 어느 10000의 값을 생성하지 않습니다. 이것은 아마도 당신이 1과 10000 사이의 임의의를 생성하는 많은 문제가 아니라, 1에서 5 사이의 동일한 알고리즘은 눈에 띄는 것입니다. 당신 모드에 1을 추가합니다.

    내 테스트에 따르면, 대답은 위의 어느 10000의 값을 생성하지 않습니다. 이것은 아마도 당신이 1과 10000 사이의 임의의를 생성하는 많은 문제가 아니라, 1에서 5 사이의 동일한 알고리즘은 눈에 띄는 것입니다. 당신 모드에 1을 추가합니다.

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

    10.이 조각은 0.0과 1.0 사이의 float를 반환에서 랜드 ()을위한 합리적인 대체를 제공 할 것으로 보인다. 전체 난수 다음 VARBINARY로 변환보다 약간 상이해도 그것은 NEWID 의해 제공된 마지막 3 바이트 ()를 사용하므로 INT 후 추천 답변에서 모딩. 상대적으로 성능을 테스트 할 수있는 기회를했다하지만 내 목적을 위해 충분히 빠른 (랜덤 충분히) 것 같습니다하지 않았습니다.

    이 조각은 0.0과 1.0 사이의 float를 반환에서 랜드 ()을위한 합리적인 대체를 제공 할 것으로 보인다. 전체 난수 다음 VARBINARY로 변환보다 약간 상이해도 그것은 NEWID 의해 제공된 마지막 3 바이트 ()를 사용하므로 INT 후 추천 답변에서 모딩. 상대적으로 성능을 테스트 할 수있는 기회를했다하지만 내 목적을 위해 충분히 빠른 (랜덤 충분히) 것 같습니다하지 않았습니다.

    SELECT CAST(SubString(CONVERT(binary(16), newid()), 14, 3) AS INT) / 16777216.0 AS R
    
  11. ==============================

    11.나는 임의의 숫자를 다루는 # c를 사용합니다. 그것은 훨씬 청소기입니다. 나는 임의의 숫자와 고유 키의 목록을 반환하는 데 사용하는 기능을 가지고, 그때는 행 번호에 uniqueKey 가입 할 수 있습니다. 나는 # c를 사용하기 때문에, 나는 쉽게 임의의 숫자가 감소해야하는 내 범위를 지정할 수 있습니다.

    나는 임의의 숫자를 다루는 # c를 사용합니다. 그것은 훨씬 청소기입니다. 나는 임의의 숫자와 고유 키의 목록을 반환하는 데 사용하는 기능을 가지고, 그때는 행 번호에 uniqueKey 가입 할 수 있습니다. 나는 # c를 사용하기 때문에, 나는 쉽게 임의의 숫자가 감소해야하는 내 범위를 지정할 수 있습니다.

    여기에 기능을하는 단계입니다 : http://www.sqlwithcindy.com/2013/04/elegant-random-number-list-in-sql-server.html

    내 쿼리처럼 보이는 끝나는 것을 여기에 있습니다 :

    SELECT 
       rowNumber, 
       name, 
       randomNumber
    FROM dbo.tvfRandomNumberList(1,10,100) 
    INNER JOIN (select ROW_NUMBER() over (order by int_id) as 'rowNumber', name from client        
                )as clients
    ON clients.rowNumber = uniqueKey
    
  12. ==============================

    12.질문

    질문

    select column1, column2, cast(new_id() as varchar(10)) as column3 
    from table1
    
  13. from https://stackoverflow.com/questions/94906/how-do-i-return-random-numbers-as-a-column-in-sql-server-2005 by cc-by-sa and MIT license