2009-09-25 10 views
0

Je voudrais comparer les données numériques dans les lignes. pour exemple, j'ai une table qui a une colonne en tant que telle: -SQL qn: - comparaison des données dans les lignes

Number 
====== 
1.88 
9.99 
8.76 
9.88 

Je veux comparer 2ème valeur, 3ème valeur, 4ème valeur à la valeur 1er. Et puis 3ème, 4ème valeur au 2ème. puis 4ème au 3ème.

Comment puis-je construire un sql pour faire cela?

+0

j'ai essayé de transposer les valeurs, alors que je voulais faire une déclaration de cas pour comparer chaque valeur. mais ce sera énorme, car j'ai au moins 100 sur les valeurs. J'ai également essayé interne joignant la table avec la même colonne de nombre, puis soustraire colonne1 et colonne2 pour comparer quelle valeur est plus grande. mais la logique ne fonctionne pas exactement comme la comparaison suivante omet la valeur précédente. c'est à dire. après avoir comparé 2ème, 3ème, 4ème avec 1ère valeur. la prochaine comparaison est 3ème et 4ème avec 2ème. des idées? –

Répondre

1

Vous devez avoir une certaine façon d'attribuer des numéros de séquence aux lignes.

Tenir compte le tableau suivant:

seq number 
--- ------ 
    1 1.88 
    2 9.99 
    3 8.76 
    4 9.88 

créé avec:

drop table a; 
commit; 
create table a (seq integer,num float);          
insert into a (seq,num) values (1,1.88); 
insert into a (seq,num) values (2,9.99); 
insert into a (seq,num) values (3,8.76); 
insert into a (seq,num) values (4,9.88); 
commit;         

Vous pouvez alors exécuter:

select 
    ta.seq as aseq, 
    tb.seq as bseq, 
    ta.num as anum, 
    tb.num as bnum, 
    ta.num - tb.num as diff 
from a ta, a tb 
where tb.seq > ta.seq; 

qui vous donnera:

aseq bseq anum bnum diff 
---- ---- ---- ---- ----- 
    1  2 1.88 9.99 -8.11 
    1  3 1.88 8.76 -6.88 
    1  4 1.88 9.88 -8.00 
    2  3 9.99 8.76 1.23 
    2  4 9.99 9.88 0.11 
    3  4 8.76 9.88 -1.12 
+0

merci beaucoup, vous êtes les meilleurs, je pense que je devrais être capable de travailler à partir d'ici, merci encore. Aidez-moi. –

1

Vous n'êtes pas sûr de l'utilité de ceci, mais peut-être que c'est ce que vous cherchez ... Une façon plus simple de comparer des valeurs est d'utiliser la clause ORDER BY.

J'ai pris la liberté d'ajouter une colonne id à la table que j'appelle tblTst. Ceci est pratique pour sélectionner certaines valeurs spécifiques (voir l'ID WHERE dans la clause (...)), et il est également utilisé pour éviter uniquement les doublons dans le produit croisé. Pour comparer la table entière, omettez simplement la clause WHERE. La condition de jointure peut être strictement inférieure à (<) pour éviter de comparer les valeurs avec elles-mêmes (était simplement pratique pour tester mon '=')

Avec 100 valeurs dans le tableau le triangle inférieur (ou supérieur) de la matrice comprendra 5 000 comparaisons. (Encore une fois, je suis perplexe quant à la façon dont cela peut être utile ou amusant ...)

select T1.value AS Operand1, 
    CASE WHEN T1.Value < T2.Value THEN '<' 
      WHEN T1.Value = T2.Value Then '=' 
      ELSE '>' 
    END AS Comp, 
    T2.Value AS Operand2 
FROM tblTst T1 
JOIN tblTst T2 ON T1.id <= T2.id 
WHERE T1.id in (1,2,3,4) 

Sample output  
Operand1 Comp Operand2 
1.88 = 1.88 
1.88 < 9.99 
1.88 < 8.76 
1.88 < 9.88 
9.99 = 9.99 
9.99 > 8.76 
9.99 > 9.88 
8.76 = 8.76 
8.76 < 9.88 
9.88 = 9.88 
+0

salut pax, J'ai essayé votre sql, ça marche bien. i besoin d'une déclaration de cas pour comparer la différence, comme ceci: - valeur1> valeur2 -> +1 valeur1 < value2 --> -1 valeur1 = valeur2 -> 0 alors je dois ajouter tous les +1, - 1 (nombres) ... mjv, je n'ai pas essayé le vôtre, j'essaie de penser à mettre dans la numérotation des séquences automatiquement. des idées? –

+0

@rayhan: si la table est suffisamment petite - ce que je pense - vous pouvez simplement insérer toute sa ligne dans une nouvelle table avec le même schéma plus une colonne supplémentaire avec une clé primaire auto-incrémentée. Pax et ma solution sont essentiellement les mêmes, sauf pour la déclaration de cas. Si vous remplacez les signes de comparaison (<=> par -1, 0 et +1, soit en tant que valeurs numériques, soit en tant que striings, vous devriez obtenir ce dont vous avez besoin.Vous pouvez également copier l'instruction CASE dans la requête Pax. SIGN (ta.num -tb.num) a créé juste la différence – mjv

0

Il suffit de simplifier @ travail de paxdiablo dans le langage t-sql pour ma compréhension:


declare @t table 
(
    id integer identity (1, 1) 
) 
-- sample data 
insert @t default values 
insert @t default values 
insert @t default values 
insert @t default values 

select 
    a.id as a_id, 
    b.id as b_id 
from 
    @t as a 
cross join 
    @t as b 
where 
    a.id < b.id 
order by 
    1, 2 

donne


a_id  b_id 
----------- ----------- 
1   2 
1   3 
1   4 
2   3 
2   4 
3   4 

(6 row(s) affected) 
Questions connexes