2012-02-07 9 views
5

Próbuję uzyskać liczbę wierszy na każdy podciąg.Wybieranie liczby kolejnych rekordów

Początkowy tabela może wyglądać tak:

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

Kwerenda powinna zwracać liczbę elementów dla każdej sekwencji wartości:

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

Do tej pory nie udało się przyjść z rozwiązaniem, przynajmniej nie wystarczająco szybko dla dużych tabel. Najlepiej byłoby, gdyby instrukcja "grupowanie po" nie zepsuła porządku rekordów.

+2

Jest to nazywane kodowaniem biegunowym. –

+0

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

Odpowiedz

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

Myślę, że jest BARDZO BLISKO ... Tylko rzecz. Przy zmianie z każdego rekordu PO pierwszej, @i będzie liczbą rozpoczynającą następny cykl. Zmieniłbym twoje ELSE na ELSE @i: = 1 ... aby wskazać, że jest on resetowany z powrotem do 1 jako początek nowego ID właśnie wchodzącego. – DRapp

+0

@ DRapp: Próbowałeś? Myślę, że działa tak, jak OP chce tak jak jest, i że twoja sugestia go złamie. Potrzebujesz stale rosnącego licznika lub zgrupujesz równe wartości oddzielone grupami o różnych wartościach. – flesk

+0

masz rację ... przegapiłeś to, a twój COUNT jest rzeczywistym licznikiem, gdzie twoja wartość "i" jest siłą pomiędzy każdą cykliczną zmianą wartości ... źle zinterpretowała twoją zmienną "i" – DRapp

Powiązane problemy