/*****************************************
*
* s r a n d
*
*****************************************
*
* Functional description:
* Returns a random number between 0
* and 1. Note the random number
* generator is seeded using the current
* time.
*
*****************************************/
DECLARE EXTERNAL FUNCTION srand
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'IB_UDF_srand' MODULE_NAME 'ib_udf';
srand 란 것도 있군요.
srand는 현재의 시간을 seed로 사용한다고 합니다.
최락중 님이 쓰신 글 :
: 안녕하십니까?
:
: DB가 갖춰져 예전에 civilian님께서 답변해 주신 방법과 FirdBird FAQ에 있는 방법
: 2가지로 테스트를 해보았는데요. 결과에 이상한 점이 있었습니다.
:
: 테이블에는 약 1,000만건의 데이터가 있습니다. 이 중 1000건을 무작위로 가져오기 위해
:
: 1) SELECT FIRST 1000 * FROM table_name ORDER BY rand();
: 2) SELECT FIRST 1000 * FROM table_name ORDER BY
: ORDER BY (t1.int_col + seed)*4294967291-((t1.int_col + seed)*4294967291/49157)*49157;
:
: 두가지 방법 모두 주로 앞쪽에는 있는 레코드 위주로 추출이 됩니다.
: (레코드 일련번호가 Primary Key)
:
: 제가 원하는 것은 전체 또는 정해진 조건에 해당하는 레코드 중에서 결과를 골고루 추출하는 것입니다.
:
: 좋은 방법 없을까요?
:
: civilian 님이 쓰신 글 :
: : SELECT FIRST 10 * FROM table_name ORDER BY rand()
: :
: : 이렇게 하셔도 될듯합니다.
: :
: : rand() 함수는 파이어버드가 기본으로 제공하는 내장함수가 아니라
: : UDF로 추가하셔야 합니다.
: :
: : SQL 편집 창에서
: :
: : DECLARE EXTERNAL FUNCTION rand RETURNS DOUBLE PRECISION BY VALUE ENTRY_POINT 'IB_UDF_rand' MODULE_NAME 'ib_udf'
: :
: : 위 명령을 쓰고 실행 버튼을 누르면 UDF가 추가됩니다.
: :
: : 동작은 잘 하는군요.
: : 덕분에 저도 하나 배웠네요.
: :
: :
: : 최락중 님이 쓰신 글 :
: : : 안녕하세요.
: : :
: : : 테이블에 있는 레코드 중 일부를 무작위로 추출해야 합니다.
: : : Firebird FAQ 사이트에서 검색하니 아래와 같은 예가 있는데요.
: : : ORDER BY 의 조건식이 언제나 0이 되지 않나요?
: : : 0을 만들기 위해 이렇게 복잡하게 쓰진 않았을 것 같구요.
: : :
: : : 아직 DB가 없어 확인해 보진 못했지만, 고수님의 답변 기다립니다.
: : :
: : : How to select a random record from a table?
: : :
: : : There is no such feature in Firebird, but you can use some tricks. The following example requires that you have a unique integer column (primary key is usually used):
: : :
: : : SELECT ...field_list...
: : : FROM table t1
: : : WHERE conditions
: : : ORDER BY (t1.int_col + seed)*4294967291-((t1.int_col + seed)*4294967291/49157)*49157;
: : :
: : : If you just need one random record, limit the result set using FIRST or ROWS clause. This query will give consistent records for the same seed. If you wish to be completely random, you need to change the seed. You could use the value of int_col from previous run, or simply fetch a new value from a generator (just make sure the same value for seed is used in both places in expression).
|