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
3 Réponses :
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;
@ user9287446. . . Non. lag ()
a été introduit dans SQL Server 2012. Mais SQL Server 2008 n'est plus pris en charge.
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
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.
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;
Peut-il y avoir des lacunes (année manquante) ou des liens (même année) dans la colonne année?