2009-04-09 37 views
45

This question hỏi về việc nhận mẫu ngẫu nhiên (ish) của bản ghi trên SQL Server và câu trả lời là sử dụng TABLESAMPLE. Có tương đương trong Oracle 10 không?Chọn một mẫu ngẫu nhiên kết quả từ kết quả truy vấn

Nếu không có, có cách nào tiêu chuẩn để nhận mẫu ngẫu nhiên kết quả từ bộ truy vấn không? Ví dụ như làm thế nào một người có thể nhận được 1.000 hàng ngẫu nhiên từ một truy vấn mà sẽ trả lại hàng triệu người bình thường?

+4

Tại thời điểm này, @grokster có câu trả lời tốt hơn câu trả lời được chọn. –

Trả lời

64
SELECT * 
FROM (
     SELECT * 
     FROM mytable 
     ORDER BY 
       dbms_random.value 
     ) 
WHERE rownum <= 1000 
+3

Một chút chậm, nhưng công việc, cảm ơn bạn. –

+13

DBMS_RANDOM là PL/SQL, và không có cách SQL thuần túy nào trong Oracle để tạo ra các số ngẫu nhiên. Tất cả chuyển đổi ngữ cảnh mưa đá. – Quassnoi

9

Ngoài ra còn có một mẫu điều khoản đặc biệt để chọn tỷ lệ: http://oracleact.com/papers/sampleclause.html

+1

Điều này hoạt động trên một bảng, nhưng @op yêu cầu một 'bộ truy vấn' và mẫu không áp dụng cho một bộ truy vấn, chỉ dành cho các bảng riêng lẻ trong một kết nối. 1 để tham khảo, tuy nhiên. – Quassnoi

+0

Thực ra điều này phù hợp hơn với nhu cầu của tôi. Có vẻ như nó có thể được sử dụng cho nhiều bảng trong oracle 10, nhưng giải pháp của Quassnoi đã làm những gì tôi cần và trả lời trong vài phút vì vậy anh ta vẫn giữ được dấu tích :) –

0

Something như thế này nên làm việc:

SELECT * 
FROM table_name 
WHERE primary_key IN (SELECT primary_key 
         FROM 
         (
         SELECT primary_key, SYS.DBMS_RANDOM.RANDOM 
         FROM table_name 
         ORDER BY 2 
        ) 
         WHERE rownum <= 10); 
51

Các SAMPLE clause sẽ cung cấp cho bạn một tỷ lệ mẫu ngẫu nhiên của tất cả các hàng trong một cái bàn.

Ví dụ, ở đây chúng tôi có được 25% của các hàng:

SELECT * FROM emp SAMPLE(25) 

SQL sau đây (bằng một trong những chức năng phân tích) sẽ cung cấp cho bạn một mẫu ngẫu nhiên một số cụ thể của mỗi lần xuất hiện của một đặc biệt giá trị (tương tự như GROUP BY) trong bảng.

Ở đây chúng ta lấy mẫu 10 của mỗi:

SELECT * FROM (
SELECT job, sal, ROW_NUMBER() 
OVER (
PARTITION BY job ORDER BY job 
) SampleCount FROM emp 
) 
WHERE SampleCount <= 10 
+0

Chúng tôi không nhận được 25% số hàng hầu hết thời gian. Thay vào đó, chúng tôi nhận được một số hàng không chắc chắn. Và mọi hàng từ tập hợp ban đầu của chúng tôi đều có cơ hội tương tự (¼ ở đây) đang được chọn. –

0

Chúng tôi đã đưa ra và phân công để chọn chỉ có hai hồ sơ từ danh sách các agents..ie 2 hồ sơ ngẫu nhiên cho mỗi đại lý trong khoảng thời gian một tuần, vv ... và bên dưới là những gì chúng tôi có và nó hoạt động

with summary as (
Select Dbms_Random.Random As Ran_Number, 
      colmn1, 
      colm2, 
      colm3 
      Row_Number() Over(Partition By col2 Order By Dbms_Random.Random) As Rank 
    From table1, table2 
Where Table1.Id = Table2.Id 
Order By Dbms_Random.Random Asc) 
Select tab1.col2, 
      tab1.col4, 
      tab1.col5, 
    From Summary s 
Where s.Rank <= 2; 
10

Đây không phải là câu trả lời hoàn hảo nhưng sẽ có hiệu suất tốt hơn nhiều.

SELECT * 
FROM (
    SELECT * 
    FROM mytable sample (0.01) 
    ORDER BY 
      dbms_random.value 
    ) 
WHERE rownum <= 1000 

Mẫu sẽ cung cấp cho bạn một phần trăm bảng thực tế, nếu bạn thực sự muốn 1000 hàng bạn cần điều chỉnh số đó. Thường xuyên hơn tôi chỉ cần một số tùy ý của hàng anyway vì vậy tôi không giới hạn kết quả của tôi. Trên cơ sở dữ liệu của tôi với 2 triệu hàng tôi nhận được 2 giây so với 60 giây.

select * from mytable sample (0.01) 
1

Chức năng mẫu được sử dụng cho dữ liệu mẫu trong ORACLE. Vì vậy, bạn có thể thử như sau: -

SELECT * FROM TABLE_NAME SAMPLE(50); 

Đây 50 là phần trăm dữ liệu chứa trong bảng. Vì vậy, nếu bạn muốn 1000 hàng từ 100000. Bạn có thể thực hiện truy vấn như: -

SELECT * FROM TABLE_NAME SAMPLE(1); 

Hy vọng điều này có thể giúp bạn.

4
SELECT * FROM TABLE_NAME SAMPLE(1) 

Sẽ cung cấp cho bạn olny một tỷ lệ xấp xỉ 1% chứ không phải chính xác 1/100 số lần quan sát. Lý do có khả năng là hơn Oracle tạo ra một lá cờ ngẫu nhiên cho mỗi quan sát là liệu có đưa vào trong mẫu mà nó tạo ra hay không. Đối số 1 (1%) trong quá trình tạo thế hệ như vậy có vai trò xác suất của mỗi quan sát được chọn vào mẫu.

Nếu điều này đúng, phân phối thực tế các kích thước mẫu sẽ là nhị thức.

+0

Xin lỗi vì định dạng lạm dụng. Tôi sẽ cố gắng để đẩy mạnh. – Hors2force

2

Tôi biết điều này đã được trả lời, nhưng nhìn thấy rất nhiều lần ở đây tôi muốn thêm một phiên bản sử dụng mệnh đề MẪU nhưng vẫn cho phép để lọc hàng đầu tiên:

with cte1 as (
    select * 
    from t_your_table 
    where your_column = 'ABC' 
) 
select * from cte1 sample (5) 

Lưu ý tuy nhiên đó chọn cơ sở cần một cột ROWID, có nghĩa là nó có thể không hoạt động đối với một số chế độ xem chẳng hạn.

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