0
votes

Query SQL pour la différence entre la ligne actuelle et précédente par groupe

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 commentaires

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.


3 Réponses :


0
votes
SELECT SITEID, YEAR, max(CLASS) AS CLASS FROM [dbo].[TestTable] GROUP BY YEAR,SITEID

1 commentaires

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.



0
votes

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


1 commentaires

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.



0
votes

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;


3 commentaires

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 !