2017-07-28 9 views
0

J'essaie de créer et de remplir une vue, mais il y a des critères difficiles qui me ralentissent beaucoup. Toutes les données qui circulent proviennent d'autres tables de la base de données.Afficher la population en fonction des conditions entre les lignes

J'ai besoin de choisir une ligne seulement si une autre ligne (de la même table) Se conformer aux contraintes données: par exemple, étant donné un enregistrement, je vais le prendre si:

  • Il partage le CODE avec un autre enregistrement dans le même tableau;
  • Il a un certain type;
  • Son DATE correspond à celui avec un autre TYPE mais le même CODE;
  • Sa valeur est plus grande que l'enregistrement correspondant;

Exemple:

1. CODE1 - TYPE.A - 01/12 - 200 
2. CODE1 - TYPE.B - 01/12 - 300 
3. CODE1 - TYPE.B - 01/09 - 300 
4. CODE1 - TYPE.B - 01/12 - 100 
5. CODE2 - TYPE.B - 01/12 - 200 
6. CODE1 - TYPE.A - 01/12 - 300 

des documents ci-dessus, je ne prendre rang # 2 car il partage le CODE avec une rangée de type "A" (retenir 1), il a un certain type "B" (R2), il a une date correspondante avec ledit enregistrement (R3), et sa VALEUR est plus grande que l'enregistrement correspondant (300> 200).

  • rangée # 3 ce n'est pas correct parce qu'elle a la mauvaise date;
  • rangée # 4 ce n'est pas correct car il a une valeur plus basse;
  • La ligne 5 a le mauvais CODE;
  • la ligne # 6 a le mauvais TYPE;

Ceci était juste pour vous donner une image de toute la scène. Ce que je n'arrive pas à comprendre, c'est comment faire ce genre de vérifications inter-rangées dans la même table.

J'espère que je me suis expliqué bareley assez pour vous d'obtenir le problème!

+0

Problème: Il n'y a pas de ligne "# 2" sauf si vous avez une colonne qui fournit cette commande. –

+0

La table est triée par CODE. Le rowNum dans la question était pour le rendre un peu moins brouillon pour vous le lire :) – pedro

+0

Vous avez besoin d'une commande pour ce que vous nous avez montré. –

Répondre

1

Si je comprends bien, vous pouvez le faire avec un join:

select t.* 
from t join 
    t tt 
    on t.code = tt.code and 
     t.date = tt.date 
     t.type = 'Type.B' and 
     tt.type = 'Type.A' and 
     t.value > tt.value; 

ou équivalent, exists:

select t.* 
from t 
where exists (select 1 
       from tt 
       where t.code = tt.code and 
        t.date = tt.date 
        t.type = 'Type.B' and 
        tt.type = 'Type.A' and 
        t.value > tt.value 
      ); 
+0

Ok ça a l'air vraiment intéressant! Je vais essayer dès que je peux! – pedro

+0

Allé pour le premier et on dirait que ça marche! Merci beaucoup! – pedro