2010-10-28 9 views
2

Actuellement, j'ai cet objectif à rencontrer. J'ai besoin d'interroger la base de données pour certains résultats. Après cela, je vais devoir comparer les enregistrements: Par exemple: la requête me renvoie 10 lignes d'enregistrements, je dois ensuite comparer: ligne 1 avec 2, ligne 2 avec 3, ligne 3 avec 4 ... ligne 9 avec 10.comparer 2 lignes consécutives dans un jeu d'enregistrements

Le résultat final que je souhaite avoir est de 10 ou moins de 10 lignes d'enregistrements.

J'ai actuellement une approche. Je fais cela dans une fonction, les variables de la main appellent "précédent" et "courant". Dans une boucle, je comparerai toujours le passé et le courant que je remplis dans le jeu d'enregistrements à l'aide d'un curseur.

Après avoir obtenu chaque ligne de résultat filtré, je vais l'entrer dans une table temporaire physique. Après tous les résultats sont dans cette table temporaire. Je vais faire une requête sur cette table et insérer le résultat dans un curseur, puis retourner le curseur.

Le problème est: comment ne pas utiliser une table temporaire. J'ai fait des recherches en ligne sur l'utilisation de tables imbriquées, mais je n'arrivais tout simplement pas à le faire fonctionner.

Comment remplacer la table temporaire par autre chose? Ou existe-t-il une autre approche que je peux utiliser pour comparer les colonnes de ligne avec d'autres lignes.

EDIT

Alors désolé, peut-être je ne suis pas clair avec ma question. Voici un échantillon du résultat que j'essaie d'atteindre.

TABLEAU X

Column A B  C  D 
    100  300  99  T1 
    100  300  98  T2 
    100  300  97  T3 
    100  100  97  T4 
    100  300  97  T5 
    101  11  11  T6 

ColumnA est la clé primaire de la table. ColumnA a des doublons car la table X est une table d'audit qui conserve les pistes de tous les changements. La colonne D agit comme l'horodatage de cet enregistrement.

Pour ma requête, je ne suis intéressé par des changements dans la colonne A, B et D. Une fois la requête que je voudrais obtenir le résultat comme suit:

Column A B  D 
    100  300  T1 
    100  100  T4 
    100  300  T5 
    101  11  T6 

Répondre

1

Salut Ce n'est pas très clair ce que yuo exactement vouloir accomplir. Mais peut-être que vous pouvez aller chercher les résultats de la requête originale dans une collection PLSQL et l'utiliser pour faire votre comparaison.

1

Pour quoi faites-vous exactement la comparaison des lignes? Cherchez-vous à éliminer les doublons, ou transformez-vous les données dans un autre formulaire, puis renvoyez-le?

Pour éliminer les doublons, utilisez la fonctionnalité GROUP BY ou DISTINCT dans votre SELECT.

Si vous faites une itération sur les données initiales et que vous les transformez d'une manière ou d'une autre, alors il est difficile de le faire sans utiliser une table temporaire - mais quel est exactement votre problème avec la table temporaire? Si vous êtes préoccupé par les performances d'un curseur, alors vous pourriez faire un SELECT externe qui compare les résultats de deux SELECT internes - mais l'astuce est que le second SELECT est décalé d'une ligne, de sorte que vous devez comparer la ligne 1 contre row2, etc.

1

Je pense que vous compliquez les choses avec la table temporaire. Il peut être fait en utilisant un curseur et 2 variables temporaires. Voici le code pseudo:

declare 

v_temp_a%xyz; 
v_temp_b%xyz; 
i number; 
cursor my_cursor is select xyz from xyz; 

begin 

i := 1; 

for my_row in my_cursor loop 
if (i = 1) 
v_temp_a := my_row; 
else 
v_temp_b := v_temp_a; 
v_temp_a := my_row; 

/* at this point v_temp_b has the previous row and v_temp_a has the currunt row 
compare them and put whatever logic you want */ 

end if 

i := i + 1; 

end loop 

end 
6

Je pense que Analytics peut faire ce que vous voulez:

select col1, col2, last(col1) over (order by col1, col2) LASTROWVALUE 
from table1 

cette façon, LASTROWVALUE contiendra de valeur de col1 pour la dernière ligne, que vous pouvez comparer directement à la col1 de la ligne actuelle.

Regardez cette URL pour plus d'informations: http://www.orafaq.com/node/55

4
SELECT ROW_NUMBER() OVER(ORDER BY <Some column name>) rn, 
     Column1, <Some column name>, CompareColumn, 
     LAG(CompareColumn) OVER(ORDER BY <Some column name>) PreviousValue, 
     LEAD(CompareColumn) OVER(ORDER BY <Some column name>) NextValue, 
     case  
      when CompareColumn != LEAD(CompareColumn) OVER(ORDER BY <Some column name>) then CompareColumn||'-->'||LEAD(CompareColumn) OVER(ORDER BY <Some column name>) 
      when CompareColumn = LAG(CompareColumn) OVER(ORDER BY <Some column name>) then 'NO CHANGE'   
      else 'false'  
     end 
FROM <table name> 

Vous pouvez utiliser cette logique dans une boucle pour changer les comportements.

Questions connexes