2009-10-14 41 views
15

Tôi muốn chọn tất cả các hàng của một bảng tiếp theo là một số ngẫu nhiên từ 1 đến 9:Tạo số ngẫu nhiên trong mỗi hàng Trong Oracle Query

select t.*, (select dbms_random.value(1,9) num from dual) as RandomNumber 
from myTable t 

Nhưng số ngẫu nhiên là như nhau từ hàng cách hàng, chỉ khác với mỗi lần chạy truy vấn. Làm thế nào để làm cho số khác nhau từ hàng này sang hàng khác trong cùng một thực thi?

+0

Chỉ cần làm rõ, lệnh gọi 'dbms_random.value()' chỉ được thực thi một lần, kể từ lần thứ e 'select' nó được đánh giá trước' bên ngoài '. –

Trả lời

25

Something như thế nào?

select t.*, round(dbms_random.value() * 8) + 1 from foo t; 
+2

Cú pháp dbms_random.value (1,9) vẫn đúng, chỉ là cấu trúc truy vấn phụ sai –

+0

Ah, thậm chí không phân phối giá trị mặc dù –

6

bạn không cần một select … from dual, chỉ cần viết:

SELECT t.*, dbms_random.value(1,9) RandomNumber 
    FROM myTable t 
+0

Ah, tuyệt vời. Và làm cách nào để tạo các số nguyên ngẫu nhiên từ 1 đến 9 thay vì nổi? – Saobi

+0

sử dụng vòng… aaah, quá muộn: ( – knittl

14

Lúc đầu, tôi nghĩ rằng điều này sẽ làm việc:

select DBMS_Random.Value(1,9) output 
from ... 

Tuy nhiên, điều này không tạo ra một phân bố các giá trị đầu ra:

select output, 
     count(*) 
from (
     select round(dbms_random.value(1,9)) output 
     from dual 
     connect by level <= 1000000) 
group by output 
order by 1 

1 62423 
2 125302 
3 125038 
4 125207 
5 124892 
6 124235 
7 124832 
8 125514 
9 62557 

Lý do là khá rõ ràng tôi nghĩ .

tôi muốn đề nghị sử dụng một cái gì đó như:

floor(dbms_random.value(1,10)) 

Do đó:

select output, 
     count(*) 
from (
     select floor(dbms_random.value(1,10)) output 
     from dual 
     connect by level <= 1000000) 
group by output 
order by 1 

1 111038 
2 110912 
3 111155 
4 111125 
5 111084 
6 111328 
7 110873 
8 111532 
9 110953 
+2

dbms_random.value (1, 10) có lẽ chính xác hơn vì kết quả x lớn hơn hoặc bằng đối số đầu tiên và nhỏ hơn giá trị thứ hai theo [10.2 tài liệu] (http://docs.oracle.com/cd/B19306_01/appdev.102/ b14258/d_random.htm # i998095) – jswolf19

2

Nếu bạn chỉ cần sử dụng vòng sau đó hai số cuối (1 và 9) sẽ xảy ra ít thường xuyên, để có được phân phối đồng đều các số nguyên từ 1 đến 9, sau đó:

SELECT MOD(Round(DBMS_RANDOM.Value(1, 99)), 9) + 1 FROM DUAL 
+0

Rất đẹp. Rất hữu ích. –

Các vấn đề liên quan