2013-03-10 6 views
1

Je dois effectuer un calcul sommaire pour la structure de tableau mentionnée ci-dessous car je dois commander par "sessionId" et sous-groupe par le "sequenceId". Une session particulière peut avoir une ou plusieurs séquences. chaque séquence commence par une et avance séquencailly. les clés primaires et la séquence de flux peuvent ne pas être en tandem.Ordre compliqué Par - Sous-ordre par requête

Table >>

pk_id session-id sequence some_other columns 
    1 AAAAAAAA   1  blah-blah-blah 
    2 AAAAAAAA   2  blah-blah-blah 
    3 AAAAAAAA   3  blah-blah-blah 
    4 AAAAAAAA   2  blah-blah-blah 
    5 AAAAAAAA   1  blah-blah-blah 
    6 AAAAAAAA   3  blah-blah-blah 
    7 AAAAAAAA   3  blah-blah-blah 
    8 AAAAAAAA   2  blah-blah-blah 
    9 AAAAAAAA   1  blah-blah-blah 

je commander par

pk_id session-id sequence some_other columns 
    1 AAAAAAAA   1  blah-blah-blah 
    2 AAAAAAAA   2  blah-blah-blah 
    3 AAAAAAAA   3  blah-blah-blah 

    5 AAAAAAAA   1  blah-blah-blah 
    4 AAAAAAAA   2  blah-blah-blah 
    6 AAAAAAAA   3  blah-blah-blah 

    9 AAAAAAAA   1  blah-blah-blah 
    8 AAAAAAAA   2  blah-blah-blah 
    7 AAAAAAAA   3  blah-blah-blah 

Toute aide serait appréciée.

+1

Il est important de connaître les colonnes exactes car elles affectent le groupby. –

+0

Cela ressemble plus à une question 'ORDER BY'; de quelle manière voulez-vous «grouper» quelque chose? – BellevueBob

+0

Merci bob duell. Je m'excuse d'un ordre par question de base nous faisons le traitement du groupe d'enregistrements par session-id. j'aurais dû dire l'ordre par .. – kadalamittai

Répondre

3

En supposant que vous voulez regrouper le premier sequence=1 avec le premier sequence=2 et le premier sequence=3, et de même la deuxième 1 avec la deuxième 2 et deuxième 3 et ainsi de suite (en utilisant pk_id que l'ordre), vous pouvez utiliser l'affectation des variables pour numéroter les valeurs sequence, puis utilisez les nombres résultants pour le tri.

C'est ce que je veux dire:

SELECT 
    pk_id, 
    session_id, 
    sequence, 
    some_other_column 
FROM (
    SELECT 
    @row := (session_id = @sid AND sequence = @seq) * @row + 1 AS row, 
    pk_id, 
    @sid := session_id AS session_id, 
    @seq := sequence AS sequence, 
    some_other_column 
    FROM 
    atable, 
    (SELECT @row := 0, @sid := '', @seq := 0) AS s 
    ORDER BY 
    session_id, 
    sequence, 
    pk_id 
) AS s 
ORDER BY 
    session_id, 
    row, 
    sequence 
; 

Cette requête peut être testée at SQL Fiddle.

+0

Comme cela serait plus facile avec un champ d'horodatage. – Hogan

+0

@Hogan: Beaucoup plus naturel, oui. –

+0

incroyable .. Merci beaucoup Andriy M – kadalamittai