2009-11-09 7 views
1
 
User  Region Points Last_Updated   
1  5  0  1-Nov-09  I want this row 
2  1  5  30-Oct-09   
3  1  2  02-Nov-09   
2  2  7  02-Nov-09  and this row 
3  2  5  02-Nov-09   

En utilisant une base de données MySQL, je veux saisir tous les chefs de point pour chaque région de la région X à la région Y. Dans le cas où les points sont liés, Je voudrais utiliser last_updated comme un bris d'égalité. J'ai trouvé un moyen de le faire mais cela impliquait plusieurs requêtes sur la même table et les rejoignant ensemble. Je ne peux pas m'empêcher de penser qu'il existe une meilleure solution à cela. Des idées.Mysql: requête pour trouver la ligne avec max avec départage

+0

Merci Greg pour l'édition !! – Codezy

Répondre

4

Cela devrait fonctionner:

SELECT 
    T1.User 
FROM 
    MyUnnamedTable T1 
LEFT OUTER JOIN MyUnnamedTable T2 ON 
    T2.Region = T1.Region AND 
    (
      T2.Points > T1.Points OR 
      (T2.Points = T1.Points AND T2.Last_Updated > T1.Last_Updated) 
    ) 
WHERE 
    T2.User IS NULL AND 
    T1.Region BETWEEN x AND y 

Vous êtes essentiellement en disant: « Donnez-moi tous les utilisateurs pour lesquels il n'y a pas d'autre utilisateur qui est dans la même région et a soit plus de points ou les mêmes points avec une date mise à jour plus tard. "

+0

Oui, a bien fonctionné, merci! – Codezy

+0

Ça m'étonne toujours à quel point certaines personnes peuvent être à SQL; et je ne pense pas que je suis si mauvais non plus! J'essaie actuellement de faire quelque chose de similaire et cela va être d'une grande aide. – Dave

0

Voici une autre option:

SELECT T1.[User] 
FROM MyUnnamedTable T1 INNER JOIN (select MAX(points*100000000+convert(varchar(8),last_updated,112)) as score, region 
              from MyUnnamedTable 
              group by region) t2 ON T2.Region = T1.Region AND (t1.points*100000000+convert(varchar(8),t1.last_updated,112))=score 
WHERE T1.Region BETWEEN x AND y 

Dans la requête imbriquée, nous choisissons le maximum d'une combinaison de points et last_update. En codant des points dans les chiffres les plus significatifs, nous accordons plus de priorité aux points. En cas d'égalité, les chiffres inférieurs contenant last_update rompent l'égalité.

Autres méthodes de bris d'égalité dans SQL sont discutées dans http://sqlmag.com/t-sql/t-sql-tiebreakers