2012-07-15 15 views
6

Sütunlar date_trans, time_trans, price içeren bir tablom var. Seçim sorgusundan sonra, fiyat sütununun ardışık olarak eşit değerleri olarak hesaplanacak olan yeni bir sütun "Count" eklemek istiyorum ve ardışık olarak eşit fiyatlara sahip olan önceki satırlar nihai sonuçtan kaldırılacak. Milyonlarca seçerken ben bir seçme sorgusu ve seçilen tüm satırları döngü olmak yapabilir,Bir sorguyu optimize edin veya LINQ ürününü tavsiye edin

date_trans time_trans price **Count**  
2011-02-22 09:39:59 58.02 1 
2011-02-22 09:40:03 58.1 *ROW WILL BE REMOVED 
2011-02-22 09:40:07 58.1 *ROW WILL BE REMOVED 
2011-02-22 09:40:08 58.1 3 
2011-02-22 09:40:10 58.15 1 
2011-02-22 09:40:10 58.1 *ROW WILL BE REMOVED 
2011-02-22 09:40:14 58.1 2 
2011-02-22 09:40:24 58.15 1 
2011-02-22 09:40:24 58.18 *ROW WILL BE REMOVED 
2011-02-22 09:40:24 58.18 *ROW WILL BE REMOVED 
2011-02-22 09:40:24 58.18 3 
2011-02-22 09:40:24 58.15 1 

Şu tablodan seçmek için bir sql sorgu veya LINQ ifadesini önerin ama: beklenen çıkışı Bkz satırlar saat sürer.

Benim geçerli kod: ilginç biri

string query = @"SELECT date_trans, time_trans, price 
          FROM tbl_data 
         WHERE date_trans BETWEEN '2011-02-22' AND '2011-10-21' 
         AND time_trans BETWEEN '09:30:00' AND '16:00:00'"; 

      DataTable dt = oUtil.GetDataTable(query); 

      DataColumn col = new DataColumn("Count", typeof(int)); 
      dt.Columns.Add(col); 

      int priceCount = 1; 
      for (int count = 0; count < dt.Rows.Count; count++) 
      { 
       double price = Convert.ToDouble(dt.Rows[count]["price"]); 
       double priceNext = (count == dt.Rows.Count - 1) ? 0 : Convert.ToDouble(dt.Rows[count + 1]["price"]); 
       if (price == priceNext) 
       { 
        priceCount++; 
        dt.Rows.RemoveAt(count); 
        count--; 
       } 
       else 
       { 
        dt.Rows[count]["Count"] = priceCount; 
        priceCount = 1; 
       } 
      } 
+0

SQL'de analitik işlevlerle mümkün olduğunu düşünüyorum. Geç oldu, bu yüzden beynim artık hepsini işleyemiyor, ama dinlendiğimde, geri dönüp hala bir cevaba ihtiyacınız olup olmadığını göreceğim. Ama bence bu yanıtı (http://stackoverflow.com/questions/7854854/getting-all-consecutive-rows-differing-by-certain-value) ve analitik fonksiyonları nasıl kullandığını görerek başlamalıyız. – Ally

cevap

2

. Aksi gruplar olmayabilir,

gruplama sütun ayrıca "fiyat" eklemesi gereken http://www.sqlmag.com/article/sql-server/solution-to-the-t-sql-puzzle-grouping-consecutive-rows-with-a-common-element

GÜNCELLEME:

SELECT MAX(date_trans), MAX(time_trans), MAX(price), COUNT(*) 
FROM 
    (SELECT *, ROW_NUMBER() OVER(PARTITION BY price ORDER BY date_trans, time_trans) - ROW_NUMBER() OVER(ORDER BY date_trans, time_trans) AS grp 
    FROM transactions) grps 
GROUP BY grp 

çözüm burada Bulunan: Ben böyle bir şey olurdu ne gerek düşünmek benzersiz olmak. Bir şey daha, tarih ve zaman sütununun datetime sütununda birleştirilmesidir, bu yüzden max datetime değeri bir günün sonuna yaklaşan ve bir sonraki başlangıcın sonunda sona eren gruplarda doğrudur. İşte düzeltilmiş sorgu.

SELECT MAX(CAST(date_trans AS DATETIME) + CAST(time_trans AS DATETIME)) , MAX(price), COUNT(*) 
FROM 
    (SELECT *, 
     CAST(ROW_NUMBER() OVER(PARTITION BY price ORDER BY date_trans, time_trans) - ROW_NUMBER() OVER(ORDER BY date_trans, time_trans) AS NVARCHAR(255)) + '-' + CAST(price AS NVARCHAR(255)) AS grp 
    FROM transactions 
    ORDER BY date_trans, time_trans) grps 
GROUP BY grp 

sorgu bir bayt dizisi 'grp kolonu ile daha uygun olabilir ya da bunun yerine, bir nvarchar bigint. Ayrıca, muhtemelen grup içinde toplamak istediğiniz bir 'hacim' sütunundan bahsettiniz.

+0

Teşekkür ederim Pawel. Neredeyse ordasın. Lütfen csv dosyasını indirin, veritabanına alın ve kontrol edin. Bazı kayıtlar çoğaltılıyor. Lütfen sorgunuzu geliştirerek bana yardımcı olun. https://docs.google.com/open?id=0B_fUxFgeU2-dc3hfR2JrR2ExQ2s Sütunlar, date_trans, time_trans, fiyat, CSV – Mainuddin

+0

Sağdaki hacimdir. Cevabı güncellendi. Daha önce fark etmedim ama 'mysql' sorgusunu etiketledin ama 'mssql' demek istedin, değil mi? –

+0

Tamam. Onu düzeltti. –

İlgili konular