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!