SQL Server Tablosundan Son Fiyatları
Verimli Bir Şekilde Alma Yöntemleri
Veritabanı yönetimi alanında, birçok geliştiricinin karşılaştığı yaygın bir zorluk, çeşitli ürünler veya kalemler için en son fiyatları, çok miktarda geçmiş veriyi içeren bir tablodan çıkarmaktır. Eğer SQL Server kullanıyorsanız, özellikle 2005 sürümünde, birçok fiyat güncellemesi bulunan bir tablodan en son fiyatları elde etmek zorlayıcı olabilir, özellikle veri kümesi büyükse. Bu blog yazısında, size gereksiz şişkinlik olmadan, belirli bir kalem grubu için benzersiz en son fiyatları almanın etkili SQL sorgularını nasıl yazacağınızı göstereceğiz.
Problemi Anlamak
Tablomuzun aşağıdaki yapısını göz önünde bulunduralım:
ID uniqueidentifier not null,
ThingID int NOT NULL,
PriceDateTime datetime NOT NULL,
Price decimal(18,4) NOT NULL
Her gün her “şey” için yüzlerce kaydınız olabilir ve bu da en son fiyat güncellemelerini sift etmek için zahmetli hale gelir. Örneğin, aşağıdaki sorguyu çalıştırdığınızda:
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4,5,6)
AND PriceDate > cast( convert(varchar(20), getdate(), 106) as DateTime)
Bu sorgu, belirtilen ThingID
‘ler için mevcut tarihten tüm fiyat kayıtlarını döndürecektir, ancak sonuç kümenizde ihtiyaç duyduğunuzdan çok daha fazla satır elde edebilirsiniz. İstenilen net: her ThingID
için sadece bir kayıt (en son fiyat) almak. Peki, buna nasıl en iyi şekilde ulaşabiliriz?
Çözüm: Alt Sorgular Kullanmak
Son fiyatları günlük olarak almanın en temiz yolu alt sorgu kullanmaktır. İşte bunu etkili bir şekilde nasıl yapabileceğiniz:
SQL Sorgu Örneği
SELECT *
FROM Thing
WHERE ID IN (SELECT max(ID)
FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID)
Bu sorguda, her ThingID
için en son girişi almamız için GROUP BY ile birlikte MAX(ID) kullanıyoruz. Buradaki varsayım, daha yüksek bir ID’nin daha yeni bir fiyatı gösterdiğidir; bu, birçok veritabanı tasarımında yaygın bir konvansiyondur.
IsCurrent
Sütununu Kullanarak Performans Artırma
Yukarıdaki sorgu etkili olsa da, daha büyük veri kümeleri için IsCurrent
adında bir sütun eklemek tavsiye edilir. Bu sütun, fiyatın en son olup olmadığını (1 ise evet, 0 ise hayır) belirtir. İşte bu yaklaşımı kullanarak basit bir sorgu oluşturmanın yolu:
SELECT *
FROM Thing
WHERE ThingID IN (1,2,3,4)
AND IsCurrent = 1
Bu basit sorgu, alt sorguların yükü olmadan en son fiyatları hızlıca filtreleyecektir. Ancak, IsCurrent
bayrağı ile birlikte veri tutarlılığını sağlamak kritik öneme sahiptir; çünkü bayrakla birlikte bayat veya yanlış veriler elde etme riski artar.
Benzersiz Tanımlayıcılarla İlgilenmek
ID
‘nin uniqueidentifier (GUID) olduğu durumlarda ek karmaşıklık ortaya çıkar. Bu yapıyı uyarlamak için sorgunuzu şu şekilde ayarlayabilirsiniz:
SELECT T.*
FROM Thing T
JOIN (SELECT ThingID, max(PriceDateTime) AS LatestPriceDate
FROM Thing
WHERE ThingID IN (1,2,3,4)
GROUP BY ThingID) X
ON X.ThingID = T.ThingID
AND X.LatestPriceDate = T.PriceDateTime
WHERE ThingID IN (1,2,3,4)
Bu güncellenmiş sorgu, her ThingID
grubu için en son fiyat tarihini özetleyen bir alt sorgu ile orijinal tabloyu birleştirerek en son fiyatları verimli bir şekilde alır.
Sonuç
SQL Server’daki büyük miktarda geçmiş veriye sahip bir tablodan en son fiyatları almak, performans tuzaklarından kaçınmak için dikkatli sorgu yapısı gerektirir. Alt sorguları kullanarak ve bir IsCurrent sütunu uygulama düşünülerek, fiyat verilerinizi yönetmede daha akıcı ve etkili bir yaklaşım elde edebilirsiniz.
İster yalnızca birkaç kalemin kayıtlarını almak isteyin, ister kapsamlı bir veri kümesiyle ilgilenin, bu rehber size en son fiyatları zahmetsizce elde etmenizde yardımcı olacaktır. İyi sorgular!