J'ai une table de base de données structurée comme celui-ci (champs non pertinents omis par souci de concision):SQL: Trouver les lignes où la valeur du champ diffère
rankings
------------------
(PK) indicator_id
(PK) alternative_id
(PK) analysis_id
rank
Tous les champs sont des nombres entiers; les trois premiers (étiquetés "(PK)") sont une clé primaire composite. Une «analyse» donnée a plusieurs «alternatives», chacune ayant un «rang» pour chacun des nombreux «indicateurs».
Je cherche un moyen efficace de comparer un nombre arbitraire d'analyses dont les rangs pour toute combinaison alternative/indicateur diffèrent. Ainsi, par exemple, si nous avons ces données:
analysis_id | alternative_id | indicator_id | rank
----------------------------------------------------
1 | 1 | 1 | 4
1 | 1 | 2 | 6
1 | 2 | 1 | 3
1 | 2 | 2 | 9
2 | 1 | 1 | 4
2 | 1 | 2 | 7
2 | 2 | 1 | 4
2 | 2 | 2 | 9
... alors la méthode idéale d'identifier les différences suivantes:
analysis_id | alternative_id | indicator_id | rank
----------------------------------------------------
1 | 1 | 2 | 6
2 | 1 | 2 | 7
1 | 2 | 1 | 3
2 | 2 | 1 | 4
Je suis arrivé avec une requête qui fait ce que je veux pour 2 ID d'analyse, mais j'ai du mal à le généraliser pour trouver des différences entre un nombre arbitraire d'ID d'analyse (ie l'utilisateur pourrait vouloir comparer 2, ou 5, ou 9, ou autre, et trouver des lignes où au moins une analyse diffère de l'un des autres). Ma requête est:
declare @analysisId1 int, @analysisId2 int;
select @analysisId1 = 1, @analysisId2 = 2;
select
r1.indicator_id,
r1.alternative_id,
r1.[rank] as Analysis1Rank,
r2.[rank] as Analysis2Rank
from rankings r1
inner join rankings r2
on r1.indicator_id = r2.indicator_id
and r1.alternative_id = r2.alternative_id
and r2.analysis_id = @analysisId2
where
r1.analysis_id = @analysisId1
and r1.[rank] != r2.[rank]
(. Il met les valeurs d'analyse dans des champs supplémentaires au lieu de lignes, je pense que de toute façon fonctionnerait.)
Comment puis-je généraliser cette requête pour traiter de nombreux ids d'analyse? (Ou, alternativement, venir avec une requête différente et meilleure pour faire le travail?) J'utilise SQL Server 2005, au cas où cela serait important.
Si nécessaire, je peux toujours extraire toutes les données du tableau et rechercher des différences de code, mais une solution SQL serait préférable car souvent je ne m'intéresse qu'à quelques lignes sur des milliers et cela ne sert à rien en les transférant tous si je peux l'éviter. (Cependant, si vous avez une raison impérieuse de ne pas le faire en SQL, dites-le - je pense que c'est une bonne réponse!)
Parfait - et des points de bonus pour le faire sans une table temporaire! Merci! –