Je suis assez nouveau à SQL. J'ai la structure de table suivante. Pour un titre donné et une année donnée, j'essaie de trouver la "nouvelle" classe qui a été ajoutée I.e une classe qui n'était pas présente l'année précédente. Chaque site peut avoir plusieurs classes.
p>
<table><tbody><tr><th>SITEID</th><th>YEAR</th><th>CLASS</th></tr><tr><td>1</td><td>2007</td><td> </td></tr><tr><td>1</td><td>2008</td><td>C</td></tr></tbody></table>
3 Réponses :
SELECT SITEID, YEAR, max(CLASS) AS CLASS FROM [dbo].[TestTable] GROUP BY YEAR,SITEID
Bonjour Minakshi, merci de répondre. Cela ne semble pas fonctionner. Je pense que ma question initiale était un peu ambiguë. Plusieurs nouvelles classes peuvent être ajoutées dans une année donnée. Par conséquent, la fonction max () ne fonctionnera pas, je pense.
Vous pouvez utiliser les fonctions de fenêtre:
select t.* from (select t.*, lag(year) over (partition by siteid, class order by year) as prev_year from t ) t where prev_year is null or prev_year <> year - 1
Bonjour Gordon, merci d'avoir répondu à ma requête. Vraiment apprécier l'aide. Votre code fonctionne bien. La seule question mineure est que, dans l'exemple prévu, le code renvoie A et B pour 2007. Comme il n'ya pas d'année avant 2007 dans mon jeu de données, et puisque j'utilise l'année précédente de comparaison, la colonne de classe pour 2007 devrait avoir Na est. Je pourrais simplement exécuter votre code comme cela, et remplacer ultérieurement toutes les valeurs de la classe pendant une année 2007 avec NA.
S'il vous plaît essayez ceci (veuillez remplacer la table TEMP avec votre table):
Si vous utilisez SQL Server, vous pouvez utiliser des expressions de table communes (CTE) comme coup: P>
CREATE TABLE test_table( SiteId INT NOT NULL, year INT, class CHAR(1) ); INSERT INTO test_table(SiteId, year, class) VALUES (1, 2007, 'A'), (1, 2007, 'B'), (1, 2008, 'A'), (1, 2008, 'B'), (1, 2008, 'C'); select distinct t1.SiteId, t1.year , case when t1.year = m.year then null else t1.class end as class_added from test_table t1 left join test_table t2 on t1.SiteId = t2.SiteId and t1.class = t2.class and t1.year -1 = t2.year left join (select * from test_table order by year limit 1) m on t1.year = m.year where t2.SiteId is null;
Salut Sam, merci d'avoir répondu. J'utilise MySQL alors j'ai essayé la deuxième requête. Il jette l'erreur suivante - "Erreur: proche" 1 ": erreur de syntaxe".
@ M1001 a mis à jour mon message pour mysql
Salut Sam, ce code MySQL mis à jour fonctionne parfaitement. Merci beaucoup pour cela !
Quoi de plus d'une classe a été ajouté à une année donnée, voulez-vous deux rangées dans les Resultats pour cette année? En outre, pourquoi ne pas classer A et B apparaître dans les Restructions en 2007, puisqu'ils n'apparaissent pas les années précédentes (il n'y a pas de rentrée antérieure).
Quelle base de données utilisez-vous: mysql, oracle, sql-serveur ...?
Bonjour GMB, merci de répondre. Plus d'une classe peut être ajoutée au cours d'une année donnée. Dans un tel cas, je voudrais que toutes les nouvelles classes soient affichées. J'utilise SQL Server.