2010-11-04 6 views
0

Je ne suis pas sûr de savoir comment google cela, alors laissez-moi juste essayer d'expliquer. Les numéros de train sont un créneau dans un horaire, et donc répéter tous les jours. Pour chaque train, il y a un ensemble d'événements du début à la fin, et ces événements incluent une valeur pour le poids actuel. Ce que je voudrais savoir, c'est le pic par train. Si je voulais juste le pic, ce serait juste un select *, max (weight) ..., mais je veux le faire par numéro de train afin que je puisse obtenir la date/heure et le nom de la station. Je veux quelque chose le long des lignes de:Trouver un pic par des valeurs différentes pour un champ

SELECT train, weight, date, station FROM event_table WHERE date >= '2010/10/03' 
    AND date <= '2010/11/03' ORDER BY weight DESC LIMIT 1 GROUP BY train 

Mais évidemment le GROUP BY ne peut pas être postérieure à la limite. Mon option est d'ignorer la limite et de la filtrer en PHP, mais c'est gaspillé des cycles et de la bande passante, ce qui pourrait être un problème dans le futur.

Merci

+0

Voir ma réponse ci-dessous. – Nightwish

Répondre

1

Si vous voulez tout le plus de poids pour chaque for-

SELECT train, Max(weight) FROM event_table WHERE date >= '2010/10/03' 
    AND date <= '2010/11/03' GROUP BY train 
1

quelque chose comme ça devrait le faire:

select t.train, t2.wt, t.date, t.station 
from event_table t, (SELECT train, max(weight) wt 
FROM event_table 
WHERE date >= '2010/10/03' 
    AND date <= '2010/11/03' 
GROUP BY train 
) t2 
where t.train = t2.train 
and t.weight = t2.weight 

note ce qui permet pour le même poids max à plusieurs stations.

+0

+ 1 pour me battre –

1

Comme alternative à la réponse de Randy, vous utilisez la syntaxe Join.

SELECT * 
FROM 
event_table et 
INNER JOIN (
    SELECT 
     train, 
     Max(weight) weight 
    FROM 
     event_table 
    WHERE date >= '2010/10/03' 
     AND date <= '2010/11/03' 
    GROUP BY train) max 
ON et.train = max.train and et.weight = max.weight 
+0

+1 pour une syntaxe plus générique :) – Randy

+0

J'ai pensé à ceux-ci. Je suppose que je vais devoir me contenter de filtrer les trains en double. – Nightwish

0

Je ne suis pas sûr que ce soit pour MySQL ou Postgress, mais je pense que cette requête peut aider:

SELECT train, 
max(weight) OVER (PARTITION BY train) 
FROM event_table ; 

* Il fonctionne à partir de la version 8.4 postgres, pas sûr de MySQL

+0

Malheureusement, c'est MySql, donc ça n'existe pas. – Nightwish

0

Je semble avoir amélioré mon Google Foo. I found this question et ont trouvé une réponse. Pour référence:

SELECT r2.train, r2.wight, r2.date, r2.station 
FROM (
     SELECT (
       SELECT id 
       FROM event_table ri 
       WHERE ri.train = r1.train and date >= '2010-10-01' AND date <= '2010-12-01' 
       ORDER BY 
         ri.weight DESC 
       LIMIT 1 
      ) rid 
     FROM (
       SELECT DISTINCT train 
       FROM event_table 
       where date >= '2010-10-01' AND date <= '2010-12-01' 
      ) r1 
) ro, event_table r2 
WHERE r2._id = ro.rid 
Questions connexes