1
votes

Comment écrire une requête SQL pour sélectionner le batteur avec le score le plus élevé que l'année précédente

Compte tenu de ce tableau:

Richie  50   2017
Richie  40   2016
Smith   60   2015

Sélectionnez batteur, score dont le score est supérieur au score précédent.

Par exemple, ici la sortie devrait être

select Name, score
from table
order by score ...

Je ne sais pas comment obtenir cette réponse - ma tentative jusqu'à présent:

Richie  50   2017
Richie  40   2016
Smith   60   2015

La sortie devrait être

XXX


1 commentaires

Peut-il y avoir des lacunes (année manquante) ou des liens (même année) dans la colonne année?


3 Réponses :


3
votes

Utilisez lag():

select t.*
from (select t.*, lag(score) over (partition by name order by year) as prev_score
      from t
     ) t
where score > prev_score;


1 commentaires

@ user9287446. . . Non. lag () a été introduit dans SQL Server 2012. Mais SQL Server 2008 n'est plus pris en charge.



1
votes

Vous pouvez le faire avec une auto-jointure:

> name   | score | year
> :----- | ----: | ---:
> Richie |    50 | 2017
> Richie |    40 | 2016
> Smith  |    60 | 2015

ou avec existe:

select t.*
from tablename t 
where exists(
  select 1 from tablename
  where name = t.name and year = t.year - 1 and score < t.score
)

Voir le démo .
Résultats:

select t.*
from tablename t inner join tablename tt
on tt.name = t.name and tt.year = t.year - 1
where t.score > tt.score


4 commentaires

S'il y a un écart de 2 ans ou plus, cette ligne ne sera pas renvoyée.


Rich 100 2018 Rich 80 2017 Rich 60 2017 Smith 50 2018 Smith 40 2017 Smith 70 2016 Rich 60 2016 select t. * From match t where exists (select 1 from match where name = t.name and year = t.year - 1 and score


il ne donne pas les résultats escomptés ... j'ai besoin de comparer seulement 20018 avec 20017 et 20017 avec 2016 etc. fondamentalement si le score des années précédentes est inférieur à celui de l'année en cours, alors j'en ai besoin dans le résultat.


@ user9287446 cela donne les résultats attendus. Vérifiez la démo dans ma réponse modifiée.



0
votes

N'utilisez pas py = (cy.year - 1) ou cy = (py.year + 1) dans la jointure, cela ne fonctionnerait pas s'il y a un intervalle de 2 ans ou plus.

Essayez ceci :

 NAME                      SCORE       YEAR
-------------------- ---------- ----------
Richie                       50       2017
Richie                       40       2016
Smith                        60       2015

Résultats:

select distinct cy.name,cy.score,cy.year from tablename cy 
join tablename py 
on cy.NAME = py.NAME and cy.year > py.year and cy.score > py.score
order by cy.year desc;


0 commentaires