rastgele etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
rastgele etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

27 Nisan 2010 Salı

Rastgele Sayı , Kayıt ve Tarih Üretmek

Aşağıdaki kod örneklerinden yararlanarak rastgele sayı, rastgele tarih ve rastgele kayıt üretebilirsiniz.


Kod biraz karmaşık görünebilir ancak mantığı çok basit.
Rastgele sıralama yapmak için kullandığımız NewID() fonksiyonu yine yardımımıza koşuyor.
1. NewID() den integer tipinde bir sayı üretmek için  tip çevirme işlemi yapıyoruz.
2. Sayıların negatif gelme olasılığı da var. Bu nedenle abs fonksiyonuna alıyoruz ki her zaman pozitif bir sayımız olsun.
3. Ancak tarih aralığının en büyük tarihi geçmesini istemediğimiz için öncelikle en büyük - en küçük tarih arasındaki gün sayısına göre, ürettiğimiz sayının modunu alıyoruz.
4. Sonra da yaptığımız şey, en küçük olmasını istediğimiz tarihe bu sayıyı eklemek.  Tarihlerdeki toplama işlemi ilgili tarihe gün sayısı ekliyor.

Sonuç, çok hızlı çalışan ve verdiğimiz tarih aralığı arasında rastgele bir tarih üreten bir fonksiyon.

SalesCount'u hesapladığımız yerde de sadece rastgele sayıyı üretiyoruz ve @mod değişkeninde   verdiğimiz sayı kadar bir sayı üretmesine izin veriyoruz.


-- buraya 20 tane kayıt ekliyorum. İçinde ne olduğu önemli değil. Önemli olan rastgele data üretmemi sağlayacak kayıt olması
DECLARE @Cnt table(Number int)
DECLARE @i int = 1
WHILE @i<=20 BEGIN
  INSERT INTO @Cnt(Number) VALUES(@i)
  SET @i+=1
END

-- A,B ve C ürünlerim olsun.
DECLARE @Product TABLE(ProductName varchar(10))
INSERT INTO @Product(ProductName) VALUES
('A'),('B'),('C')

-- Rastgele üreteceğim tarihin aralıklarını belirtiyorum.
DECLARE @mindate DATETIME = '2010-01-01'
DECLARE @maxdate DATETIME = '2010-05-31'

DECLARE @mod int = 50

SELECT
  (@mindate +(ABS(CAST(CAST( NewID() AS BINARY(8) )AS INT)    ) % CAST((@maxdate - @mindate) AS INT    )    )    ) SalesDate, -- rastgele bir tarih üretelim
  ABS(CAST(CAST( NewID() AS BINARY(8) )AS INT)    ) % @mod as SalesCount, -- rastgele bir sayı üretelim. Mod'u 50 verdim ki en fazla 49 üretsin ve büyük rakamlarla uğraşmayayım.
  P.ProductName
FROM @Cnt C CROSS JOIN @Product P

16 Nisan 2010 Cuma

Bir Tablodan Rastgele 5 Kayıt Getirmek

-- Önce test etmek için geçici bir tablo tanımlayalım.  
DECLARE @Dummy TABLE(ID int identity(1,1),Number int)

-- Bu tabloya 100 tane kayıt atalım.

-- SQL Server 2008 de değişkeni tanımlarken başlangıç değeri de verebilirsiniz. SQL Server 2008 öncesinde tanımlamayı ve başlangıç değeri vermeyi ayrı satırlarda yapmalısınız.
DECLARE @i int = 1
WHILE @i<=100 BEGIN
  INSERT INTO @Dummy(Number) VALUES(@i*@i)
  SELECT @i+=1 -- Bu da SQL Server 2008 e ait bir özellik. SELECT @i=@i+1 ifadesine karşılık gelir.
END

-- Dataları çekeceğimiz tablomuzu oluşturduk. Bakalım nasıl kayıtlar var.
SELECT * FROM @Dummy


    ID    Number
    1    1
    2    4
    3    9
    4    16
    5    25
    6    36
    ..    ..
    99    9801
    100    10000


Şimdi bu tablodan rastgele 5 tanesini seçelim. 

SELECT TOP 5  *
FROM @Dummy
ORDER BY NewID()

ID    Number
99    9801
25    625
65    4225
51    2601
15    225


NewID fonksiyonu  uniqueidentifier tipinde bir veri oluşturur ve her çektiğinizde de farklı bir değer oluşturur. Her seferinde farklı değerler üreten bu fonksiyonu ORDER BY a ekledim, böylece bizim tablomuzun kayıt yaratılma sırasına göre değil, anlık üretilen NewID ye göre sıralayacak kayıtları. "TOP 5" ifadesi de ilk 5 kaydın gelmesini sağlayacak.

DECLARE @Guid uniqueidentifier = NewID()
SELECT @Guid as Guid

Guid
7facc454-b048-4e44-8d72-b7a9b97fb370




Akla hemen neden random sayı üreten RAND() fonksiyonunu kullanmadık diye bir soru da gelebilir.
RAND() fonksiyonu  bir transaction içinde aynı sayıyı üretir.

SELECT RAND() as Random, * FROM @Dummy

kodunu çalıştırırsak Random kolonunda hep aynı sayının geldiğini görebilirsiniz.