0
votes

Comment obtenir des valeurs qui n'existent pas dans une autre table, en ignorant les valeurs dupliquées avec la date la plus récente

Comment obtenir uniquement les valeurs de niveau_20 dans le tableau A qui n'existent pas dans le tableau B étant donné le FF. Scénario:

  • Si le prix avec code_level niveau_20 a la même valeur de niveau_20 dans A, ignorez-le!
  • S'il y a plusieurs valeurs de prix, comparez la valeur avec la date maximale de B

    Tableau A XXX

    Tableau B xxx

    TABLEAU C xxx

    Sortie attendue: xxx

    mon code (faux): xxx


0 commentaires

3 Réponses :


1
votes

Utilisation de cette requête sans inclure le tableau B code> est suffisant en raison de votre sortie attendue et en fonction des données de vos tableaux:

with a(ALIAS, LEVEL_20, POINTS, "DATE") as
(
 select 'Jbax',300,325,date'2018-06-20' from dual union all
 select 'Cvg2',100,103,date'2018-06-20' from dual union all
 select 'Deg1',200,281,date'2018-06-20' from dual         
),   b(ALIAS, CODE_LEVEL, PRIZE, "DATE") as
(
 select 'Jbax','Level_20',500,date'2017-01-15' from dual union all
 select 'Jbax','Level_10',200,date'2017-03-20' from dual union all
 select 'Cvg2','Level_20',100,date'2017-04-05' from dual union all
 select 'Deg1',null,null,null  from dual union all    
 select 'Cvg2','Level_20',50,date'2017-02-01'  from dual
),   c(ALIAS,NAME) as
(
 select 'Jbax','Jessie' from dual union all 
 select 'Cvg2','Carol' from dual union all
 select 'Deg1','Danny' from dual
)  
select c.name, a.level_20
  from c
  join a on a.alias = c.alias  
 where (a.alias,a.level_20) not in 
      (select a.alias,b.prize 
         from a
         join b on b.prize = a.level_20 and b.code_level = 'Level_20');

 NAME   LEVEL_20
 ------ --------
 Jessie 300
 Danny  200


1 commentaires

Merci, mais ce que je veux dire par plusieurs valeurs de prix, CVG2 a 100 et 50 dans le tableau B - Je veux comparer la valeur de niveau_20 de A avec la date maximale de la table < Code> B dans ce cas. Dis que je change de CVG2 avec 200 et 100 (à partir de 100 et 50 à l'origine avec les mêmes dates) dans le tableau B , votre code exclura Carol - mais elle doit être dans la sortie depuis 200 ( B avec la date maximale) <> 100 ( A )



0
votes

Cela devrait vous donner le résultat attendu:

    with get_max_value as 
    (
     select b2.*, max(b2."DATE") over (partition by b2.ALIAS)  mdate from b b2
    )
    select my_c.name, my_a.level_20
      from c my_c join a my_a on my_a.alias = my_c.alias  
     where (my_a.alias,my_a.level_20) not in 
          (select a2.alias, gmv.prize 
             from a a2 join get_max_value gmv on gmv.prize = a2.level_20 
             and gmv.code_level = 'Level_20' 
             WHERE gmv."DATE" = gmv.mdate);


0 commentaires

1
votes

Cette requête ajoute le tri dans le tableau B : xxx

résultat: xxx

alors vous pouvez donc maintenant que vous puissiez Prenez seulement ces lignes qui sont les plus récentes ( rn = 1 ) et ont un prix NULL ou un prix diffère de a.level_20 : < Pré> xxx

Dbfiddle Demo (j'ai ajouté une ligne là-bas)


1 commentaires

Exactement ce dont j'ai besoin, merci je suis content que vous ayez compris mes besoins!