2012-02-07 11 views
5

मैं प्रत्येक अनुवर्ती प्रति पंक्तियों की संख्या प्राप्त करने की कोशिश कर रहा हूं।अनुक्रमिक रिकॉर्ड्स की संख्या का चयन

प्रारंभिक तालिका ऐसा दिखाई दे सकता:

+----+-------------+ 
| id | value  | 
+----+-------------+ 
| 1 | a   | 
| 2 | b   | 
| 3 | b   | 
| 4 | c   | 
| 5 | a   | 
| 6 | a   | 
| 7 | a   | 
| 8 | a   | 
| 9 | c   | 
| 10| c   | 
+----+-------------+ 

क्वेरी से प्रत्येक मान के अनुक्रम लिए आइटम की गणना लौटना चाहिए:

+----+-------------+ 
| value | count | 
+----+-------------+ 
| a | 1  | 
| b | 2  | 
| c | 1  | 
| a | 4  | 
| c | 2  | 
+-------+----------+ 

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

+2

इसे रन-लम्बाई एन्कोडिंग कहा जाता है। –

+0

http://stackoverflow.com/questions/9172006/how-to-combine-near-same-item-by-sql – flesk

उत्तर

2
SELECT value, count(*) FROM (
    SELECT value, 
    (CASE WHEN @v != value THEN @i:[email protected]+1 ELSE @i END) gid, 
    @v := value FROM myTable, (SELECT @v:='', @i := 0) vars 
) tbl 
GROUP BY gid 
+0

का डुप्लिकेट मुझे लगता है कि यह बहुत बंद है ... केवल एक चीज। पहले के बाद प्रत्येक रिकॉर्ड से परिवर्तन पर, @i अगले चक्र से शुरू होने वाली गिनती होगी। मैं आपके ईएलएसई को ईएलएसई @i: = 1 में बदल दूंगा ... यह इंगित करने के लिए कि इसे वापस आने वाले नए आईडी की शुरुआत के रूप में 1 पर रीसेट किया जा रहा है। – DRapp

+0

@DRapp: क्या आपने इसे आजमाया? मुझे लगता है कि यह ओपी के रूप में काम करता है, और यह कि आपका सुझाव इसे तोड़ देगा। आपको लगातार बढ़ते काउंटर की आवश्यकता है, या आप अलग-अलग मूल्यों के समूहों द्वारा अलग-अलग मूल्यों को एक साथ समूहित करेंगे। – flesk

+0

आप सही हैं ... इसे याद किया गया है, और आपका COUNT वास्तविक काउंटर है जहां आपका "i" मान मूल्यों के बीच प्रत्येक चक्रीय परिवर्तन के बीच बल तोड़ है ... आपके "i" चर का गलत व्याख्या – DRapp

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