2010-07-27 13 views
1

I ont un tableau similaire à ce qui suit (bien sûr avec plus de lignes et champs):MySQL Combiner plusieurs lignes

category_id | client_id | date  | step 
    1   1  2009-12-15 first_step 
    1   1  2010-02-03 last_step 

    1   2  2009-04-05 first_step 
    1   2  2009-08-07 last_step 

    2   3  2009-11-22 first_step 

    3   4  2009-11-14 first_step 
    3   4  2010-05-09 last_step 

Je voudrais transformer ce que je puisse calculer le temps entre le premier et le dernier étapes et finissent par trouver le temps moyen entre la première et la dernière étapes, etc. en fait, je suis perplexe sur la façon de transformer le tableau ci-dessus en quelque chose comme:

category_id | first_date | last_date 
    1  2009-12-15 2010-02-03 
    1  2009-04-05 2009-08-07 
    2  2009-11-22 NULL 
    3  2009-11-14 2010-05-09 

Toute aide serait appréciée.

Avec OMG Poneys aide, voici la solution:

SELECT t.category_id, 
    MIN(t.date) AS first_date, 
    CASE 
     WHEN COUNT(*) >= 2 THEN MAX(t.date) 
     ELSE NULL 
    END AS last_date 
FROM TABLE t 
GROUP BY t.category_id, t.client_id 

Répondre

4

Mise à jour basé sur la mise à jour des questions/clarification:

SELECT t.category_id, 
     MIN(t.date) AS first_date, 
     CASE 
      WHEN MAX(t.date) = MIN(t.date) THEN NULL 
      ELSE MAX(t.date) 
     END AS last_date 
    FROM TABLE t 
GROUP BY t.category_id, t.client_id 
+0

J'ai peut-être trop simplifié mon exemple, alors je l'ai changé. Il y a beaucoup d'entrées par catégorie. – Mitchell

+0

Ok, tant que je change la clause GROUP BY à: GROUP BY t.category_id, t.client_id cela fonctionne. – Mitchell

+0

@Mitchell: Mise à jour, merci de mettre à jour les résultats attendus. –

1

un GROUP BY simple devrait faire l'affaire

SELECT category_id 
     , MIN(first_date) 
     , MAX(last_date) 
    FROM TABLE 
GROUP BY category_ID 
+0

+1: Mais il vous manquait la clause FROM –

+0

Oui, tant que je change la clause GROUP BY à: GROUP BY category_id, client_id cela fonctionne. – Mitchell

+0

Je viens de réaliser qu'il ne marque pas last_date comme NULL lorsqu'il n'y a pas last_date. – Mitchell

0

simples answer:

SELECT fist.category_id, first.date, last.date 
    FROM tableName first 
    LEFT JOIN tableName last 
     ON first.category_id = last.category_id 
     AND first.step = 'first_step' 
     AND last.step ='last_step' 

Vous pouvez également effectuer les calculs dans la requête au lieu de simplement renvoyer les deux valeurs de date.

+1

Cela donnera en fait toutes les combinaisons de dates pour chaque catégorie là-bas. –

+0

Vous avez raison ... c'est ce que je reçois pour aller trop vite. Merci d'avoir attrapé ça. – kniemczak

+0

Oui, je viens d'essayer et ça donne beaucoup de résultats – Mitchell

1

Essayez:

 
select 
    category_id 
    , min(date) as first_date 
    , max(date) as last_date 
from 
    table_name 
group by 
    category_id 
    , client_id 
+0

J'ai peut-être trop simplifié mon exemple, donc je l'ai changé. Il y a beaucoup d'entrées par catégorie. – Mitchell

+0

Oui, tant que je modifie la clause GROUP BY à: GROUP BY category_id, client_id cela fonctionne. – Mitchell

+0

Bien. J'ai mis à jour ma requête pour refléter vos modifications. – wshato

0

Vous devez faire deux sous-requêtes puis les réunir - quelque chose comme

sélectionnez * de (sélectionnez *, la date comme first_date à partir de table où step = "first_step") a left join (sélectionnez * date last_date de tableau où étape = "lastt_step") b sur (a.category_id = b.category_id)

Amusez-vous!

+0

Je viens de l'essayer et comme la réponse de Kniemczak, je pense que cela donne toutes les combinaisons de dates. – Mitchell