Bir Tablodan Rastgele Kayıt Çekmek

22 Şubat 2009

Oracle

Yerli ve yabancı çeşitli forumlarda veritabanındaki bir tablodan rastgele kayıt çekebilmek ile ilgili sorular görüyorum. Bu işin veritabanı üzerinde çözülebileceğini bilmeyenler bunu uygulamalarının ekledikleri kodlarla çözmeye çalışıyorlar. Aslında bu iş veritabanı için çok kolay, çünkü Veritabanı Yönetim Sistemleri random sayı üretmek ile ilgili fonksiyonlara sahiptirler. Bunları kullanarak veritabanından kolaylıkla rastgele kayıt çekebiliriz. Aslında uygulayacağımız yöntem var olan kayıtların arasından rastgele belirlenen bir kayıdı sorgulamak değil, var olan tabloyu sanal bir alana göre sıralayıp ilk (veya istenilen) sayıda kayıdı okumak. Hemen en basit haliyle Oracle’da bu işin nasıl yapılacağını görelim:

SQL> SELECT * FROM hr.employees ORDER BY DBMS_RANDOM.VALUE;

Bu komut ile HR schemasındaki employees tablosundan çekilen kayıtlar DBMS_RANDOM.VALUE fonksiyonunun ürettiği rastgele sayılara göre sıralanacaktır. Bu yüzden bu sorgunun her çağrılışında dönen kayıtların sırası değişik olacaktır. Siz bu dönen kayıtlardan bir veya daha fazlasını okuyarak istediğiniz rastgele kayıda ulaşabilirsiniz.

Aynı sorguyu MySQL için şu şekilde yazabiliriz:

SQL> SELECT * FROM employees ORDER BY RAND();

Microsoft SQL Server’da RAND() fonksiyonu bulunmasına rağmen, MySQL için yazdığımız sorguyu Microsoft SQL Server’da kullanamıyoruz. Çünkü Microsoft SQL Server’daki RAND() fonksiyonu birden fazla kayıt döndüren bir sorgu içerisinde çağrıldığında random olarak hep aynı sayıyı döndürüyor. Bu yüzden random kayıt seçebilmek için RAND() yerine, NEWID() kullanılması gerekiyor:

SQL> SELECT * FROM employees ORDER BY NEWID();

Bu sorgu random sayı üretmek yerine, her satır/kayıt için unique ID’ler üretiyor ve daha sonra bu ID’lerin içeriğine göre kayıtları sıralayarak döndürüyor. Bu sayede istenilen tablodan rastgele kayıtlar seçilebilmiş oluyor.

Bookmark and Share
,

Yazar:

Gökhan Atıl <gokhan@gokhanatil.com>

Veritabanı ve Unix uzmanı olarak Koç.Net'de çalışmaktadır. OCP (Oracle Certified Professional), Oracle Certified SQL Expert, Comptia Linux+ sertifikalarına sahiptir.

4 Responses to “Bir Tablodan Rastgele Kayıt Çekmek”

  1. TongucY:

    Söz konusu Oracle veritabanı ise DBMS_RANDOM.VALUE kullanılabilir bu amaçla, ama örneğinizdeki “RAND()” isimli işlev 11g dahil hiç bir sürümde mevcut değil?

  2. Gökhan Atıl:

    Haklısınız, düzeltme için teşekkürler. Dalgınlıkla MySQL’deki RAND()’ı alıp, Oracle’a monte etmişim.

  3. Cihan Yakar:

    Aynı işi Access ile yapmak istersek Rnd() fonksiyonunu kullanabiliriz.

    SELECT * FROM employees ORDER BY RND(employees_id);

    Örnekte employees_id ‘nin bir sayı türü olarak tanımlandığı versayılmıştır.

  4. Adnan:

    Sampling by rows olarak
    SELECT * FROM emp SAMPLE (30);
    veya sampling by blocks olarak
    SELECT * FROM emp SAMPLE BLOCK (30);

    şeklinde de kullanım yapılabilir.

    sample range aralığı [0.000001 , 99.999999] olabilir. Özellikle belli bir oranda test datasına ihtiyacınız var ise bu yöntem kullanılabilir.

    Subject:How to Randomly Select Records from Result Set / Doc ID: 95455.1


Leave a Reply