Sql comparaison nestede sur une colonne

Imaginez une table:

ID Month Year Value 1 1 May 17 58 2 June 09 42 3 December 18 58 4 December 18 58 5 September 10 84 6 May 17 42 7 January 16 3 

Je veux returnner toutes datatables qui partagent le même mois et l'année où la valeur 1 est différente. Donc, dans notre exemple, je veux returnner 1 et 6 seulement mais pas 3 et 4 ou l'une des autres inputs.

Y a-t-il un moyen de faire cela? Je pense à une combinaison de distinct et de groupe mais je n'arrive pas à find la bonne réponse étant nouvelle pour SQL.

Merci.

Cela pourrait être fait sans regroupement, mais avec simple auto-jointure:

  select distinct t1.* from [Table] t1 inner join [Table] t2 on t1.Month = t2.Month and t1.Year = t2.Year and t1.Value_1 <> t2.Value_1 

Vous pouvez find des informations et des exemples d'auto-association ici et ici .

Pour chaque ligne, vous pouvez examiner les agrégats de son groupe avec la clause OVER. par exemple:

 create table #t(id int, month varchar(20), year int, value int) insert into #t(id,month,year,value) values (1,'May' ,17, 58 ), (2,'June' ,09, 42 ), (3,'December' ,18, 58 ), (4,'December' ,18, 58 ), (5,'September',10, 84 ), (6,'May' ,17, 42 ), (7,'January' ,16, 3 ); with q as ( select *, min(value) over (partition by month,year) value_min, max(value) over (partition by month,year) value_max from #t ) select id,month,year,value from q where value_min <> value_max; 

Si j'ai bien compris votre question, vous cherchez le mot key HAVING .

Si vous GROUP BY Month, Year, Value_1 HAVING COUNT(*) = 1 , vous obtenez toutes les combinaisons de Mois, Année et Valeur_1 qui n'ont aucune autre occurrence.