2013-07-30 24 views
26

Chcę utworzyć bazę wyników zapytania w tym scenariuszu, który może utworzyć numer wiersza według crew_id i type.Liczba wierszy na grupę w mysql

id crew_id amount type 
1  4  1000  AUB 
2  4  1500  AUB 
3  5  8000  CA 
4  4  1000  CA 
5  5  1000  AUB 
6  6  3000  AUB 
7  4  2000  CA 
8  6  3500  AUB 
9  4  5000  AUB 
10  5  9000  CA 
11  5  1000  CA 

wyjście musi być ff:

id crew_id amount type row_number 
1  4  1000  AUB  1  
2  4  1500  AUB  2 
9  4  5000  AUB  3 
4  4  1000  CA   1 
7  4  2000  CA   2 
5  5  1000  AUB  1 
3  5  8000  CA   1 
10  5  9000  CA   2 
11  5  1000  CA   3 
6  6  3000  AUB  1 
6  6  3000  AUB  2 

chcę jeden select tylko w tym wyjściu

+1

I co próbowaliście? –

Odpowiedz

13

Pytanie jest dość stary. Ale chciałbym opublikować to na wypadek, gdyby ktoś miał ten sam problem.

Po pierwsze, opisane odpowiedzi nie działają poprawnie. Na przykład, dla

id crew_id amount type 
1  4  1000  AUB 
2  4  1500  AUB 
5  5  1000  AUB 
6  6  3000  AUB 
8  6  3500  AUB 
9  4  5000  AUB 

(ja po prostu usunięte wiersze z typu „CA”) Tabela wynikowa będzie

id crew_id amount rank type 
1  4  1000  1  AUB 
2  4  1500  2  AUB 
9  4  5000  3  AUB 
5  5  1000  4  AUB 
6  6  3000  5  AUB 
8  6  3500  6  AUB 

Więc w rzeczywistości nie używać zarówno crew_id i typ, to po prostu używa rodzaj.

Oto jak rozwiązać ten problem (prawdopodobnie jest bardziej elegancki sposób to zrobić, niż korzystać z dwóch zagnieżdżonych „CASE, ale masz pomysł):

SELECT id, 
    amount, 
    CASE crew_id 
     WHEN @curCrewId THEN 
      CASE type 
       WHEN @curType THEN @curRow := @curRow + 1 
       ELSE @curRow := 1 
      END 
     ELSE @curRow :=1 
    END AS rank, 
    @curCrewId := crew_id AS crew_id, 
    @curType := type AS type 
FROM Table1 p 
JOIN (SELECT @curRow := 0, @curCrewId := 0, @curType := '') r 
ORDER BY crew_id, type 

Ideą pozostają. Właśnie dodałem zmienną @curCrewId. Jeśli ktoś potrzebuje użyć 3 zmiennych do grupowania, po prostu użyj 3 zmiennych i 3 zagnieżdżonych "CASE". :)

+0

Dziękuję za tę prostą odpowiedź! Po prostu ulepszenie: nie ma potrzeby stosowania klauzuli JOIN, ponieważ zmienne są inicjowane w klauzuli SELECT. – BenL

+0

@BenL Nie działa bez JOIN. Niestety nie mogę tego poprawnie wyjaśnić, ale możesz po prostu spróbować :) –

40

Proszę przejść przez moje skrzypce

This One Last Tried

SELECT id, 
       crew_id, 
       amount, 
       type, 
      ( 
       CASE type 
       WHEN @curType 
       THEN @curRow := @curRow + 1 
       ELSE @curRow := 1 AND @curType := type END 
      ) + 1 AS rank 
    FROM  Table1 p, 
       (SELECT @curRow := 0, @curType := '') r 
    ORDER BY crew_id,type asc; 
+0

Czy można załączyć crew_id? czy możesz go uszeregować według crew_id i AUB? – user1852837

+0

Jest to niewielki problem. Jeśli typ zaczyna się od liczby, pozycja zaczyna się od 2 zamiast 1. Jakieś pomysły, jak to naprawić? – SystemParadox

+1

@SystemParadox pobiera '+ 1' od') + 1 AS rank'' –

0
SELECT id, crew_id, amount, type, 
     ( 
     CASE type 
      WHEN @curType 
      THEN @curRow := @curRow + 1 
      ELSE @curRow := 1 AND @curType := type END 
    ) + 1 AS rank 
FROM  Table1 p, 
     (SELECT @curRow := 0, @curType := '') r 
    ORDER BY crew_id, type asc; 
2

@ Odpowiedź Janty'ego nie działa, gdy typ zaczyna się od liczby (ranga zaczyna się od 2 zamiast 1).

Użyj następującego zamiast:

SELECT id, 
    crew_id, 
    amount, 
    CASE type 
     WHEN @curType THEN @curRow := @curRow + 1 
     ELSE @curRow := 1 
    END AS rank, 
    @curType := type AS type 
FROM Table1 p 
JOIN (SELECT @curRow := 0, @curType := '') r 
ORDER BY crew_id, type 
0

Oto moja odpowiedź używając tylko jeden przypadekktóry tworzy numer wiersza według obie kolumny:

SELECT id, crew_id, amount, type, 
    (CASE CONCAT(crew_id, type) 
     WHEN @cur_crew_type 
     THEN @curRow := @curRow + 1 
     ELSE @curRow := 0 END) + 1 AS cnt, 
    @cur_crew_type := CONCAT(crew_id, type) AS cur_crew_type 
FROM TABLE t, 
    (SELECT @curRow := 0, @cur_crew_type := '') counter 
     ORDER BY crew_id, type; 
1

Poza odpowiedzią @Janty Oto rozwiązanie, jeśli chcesz UDATE swój stół z rownumber:

UPDATE myTable mt,(SELECT @curRow := 0, @curType := '') r SET type= 
    ( 
     CASE type 
      WHEN @curType 
     THEN @curRow := @curRow + 1 
     ELSE @curRow := 1 AND @curType := type END 
    ) 
; 

Jako janty zbyt crewId nie jest w. Użyj drugiego "przypadku", jak wspomniano w innych odpowiedziach.

+0

jak dodać porządek według zdania – ASD