2012-07-15 16 views
6

का सुझाव दें मेरे पास एक तालिका है जिसमें कॉलम date_trans, time_trans, कीमत है। चयन क्वेरी के बाद, मैं एक नया कॉलम "गणना" जोड़ना चाहता हूं जिसे मूल्य कॉलम के लगातार बराबर मानों के रूप में गणना की जाएगी और अंतिम पंक्तियों वाली पिछली पंक्तियों को अंतिम परिणाम से हटा दिया जाएगा। अपेक्षित आउटपुट देखें:एक क्वेरी अनुकूलित करें या LINQ समकक्ष

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 

कृपया

वर्तमान में मेज से चयन करने के लिए एक एसक्यूएल क्वेरी या LINQ अभिव्यक्ति का सुझाव, मैं इसे एक का चयन क्वेरी और सभी चयनित पंक्तियों के माध्यम से पाशन हो कर सकते हैं, लेकिन जब लाखों लोगों का चयन पंक्तियों में घंटों लगते हैं।

मेरे वर्तमान कोड:

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

मुझे लगता है कि एसक्यूएल में विश्लेषणात्मक कार्यों के साथ यह संभव है। देर हो चुकी है इसलिए मेरा दिमाग अब इसे संसाधित करने में सक्षम नहीं है, लेकिन जब मुझे विश्राम किया जाता है, तो मैं वापस आऊंगा और देखूंगा कि आपको अभी भी जवाब की आवश्यकता है या नहीं। लेकिन मुझे लगता है कि आपको [इस उत्तर] को देखकर शुरू करना चाहिए (http://stackoverflow.com/questions/7854854/getting-all-consecutive-rows-differing-by-certain-value) और यह विश्लेषणात्मक कार्यों का उपयोग कैसे करता है। – Ally

उत्तर

2

एक दिलचस्प एक है यही कारण है कि।

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 

मिले यहाँ समाधान: मैं क्या आप कुछ इस तरह किया जाएगा की जरूरत है http://www.sqlmag.com/article/sql-server/solution-to-the-t-sql-puzzle-grouping-consecutive-rows-with-a-common-element

अद्यतन

समूहीकरण स्तंभ भी "मूल्य" शामिल करने के लिए की जरूरत है, अन्यथा समूहों नहीं हो सकता है विलक्षण हो। एक और बात यह है कि दिनांक और समय कॉलम को डेटाटाइम कॉलम में जोड़ा जाना चाहिए ताकि अधिकतम डेटाटाइम वैल्यू उन समूहों में सही हो जो एक दिन के अंत तक शुरू हो जाएं और अगले की शुरुआत में समाप्त हो जाएं। यहां सही क्वेरी है।

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 

क्वेरी एक बाइट सरणी के रूप में 'जीआरपी' कॉलम के साथ और अधिक इष्टतम है या एक nvarchar के बजाय BigInt हो सकता है। इसके अलावा आपने एक 'वॉल्यूम' कॉलम का उल्लेख किया है जिसे आप शायद समूह के भीतर जोड़ना चाहते हैं।

+0

धन्यवाद Pawel। तुम लगभग वहां थे। कृपया सीएसवी डाउनलोड करें, डेटाबेस में आयात करें और जांचें। कुछ रिकॉर्ड डुप्लिकेट दिखा रहे हैं। कृपया अपनी क्वेरी में सुधार करके मेरी मदद करें। https://docs.google.com/open?id=0B_fUxFgeU2-dc3hfR2JrR2ExQ2s कॉलम दिनांक_trans, time_trans, कीमत, वॉल्यूम CSV – Mainuddin

+0

दाएं हैं। उत्तर अपडेट किया गया। मैंने इसे पहले नहीं देखा लेकिन आपने अपना प्रश्न 'mysql' टैग किया लेकिन आपका मतलब 'mssql' था, है ना? –

+0

ठीक है। ठीक कर दिया। –

संबंधित मुद्दे