2008-11-04 4 views
1

Je vais simplifier le problème, autant que possible:Comment compresser ce jeu de résultats Oracle en valeurs en fonction de la priorité de ligne, en ignorant les valeurs NULL?

J'ai une table d'oracle:

row_priority, col1, col2, col3 
0, .1, 100, {null} 
12, {null}, {null}, 3 
24, .2, {null}, {null} 

Résultat souhaité:

col1, col2, col3 
.2, 100, 3 

Ainsi, selon la priorité de la ligne, il remplace les valeurs de ligne précédentes, si elles sont indiquées.

je tente de trouver une solution en utilisant des fonctions analytiques sur la table, mais il se comporte pas seulement ...

J'essaie:

select last_value(col1 ignore nulls) over() col1, 
     last_value(col2 ignore nulls) over() col2, 
     last_value(col3 ignore nulls) over() col3 
from (select * from THE_TABLE order by row_priority) 
where rownum = 1 

ou l'inverse:

select first_value(col1 ignore nulls) over() col1, 
     first_value(col2 ignore nulls) over() col2, 
     first_value(col3 ignore nulls) over() col3 
from (select * from THE_TABLE order by row_priority desc) 
where rownum = 1 

Et aucun ne semble ignorer les valeurs NULL. Des indices?

Répondre

2

Vous devez mettre rownum = 1 à l'extérieur de la requête d'analyse

SELECT * 
FROM ( select   last_value(col1 ignore nulls) over() col1, 
          last_value(col2 ignore nulls) over() col2, 
          last_value(col3 ignore nulls) over() col3 
      from (select * from THE_TABLE ORDER BY ROW_PRIORITY) 
     ) 
WHERE ROWNUM = 1 

qui se traduit par (en utilisant vos valeurs ci-dessus):

COL1 COL2 COL3 
------ ------- ---- 
0.2 100  3 
+0

Voir une discussion supplémentaire que j'ai commencé concernant la nature de la commande avec analyse: http://stackoverflow.com/questions/262278/oracle-analytics-partitions-and-ordering-of-sql-queries. Pendant que vos modifications fonctionnent dans ce cas, vous devez toujours commander dans la clause de partition. – ScottCher

+0

Je ne suis pas d'accord sur la commande dans la clause de partition, bien que j'aimerais voir le plan. Mes résultats sont déjà commandés et je profite de fonctionnalités documentées. Je ne voudrais pas le réorganiser 3 fois. – TheSoftwareJedi

-1

La fonction COALESCE peut vous être utile ici. Peut-être comme ...

select first_value(coalesce(col1,0) ignore nulls) over() col1, 
     first_value(coalesce(col2,0) ignore nulls) over() col2, 
     first_value(coalesce(col3,0) ignore nulls) over() col3 
from THE_TABLE 
+0

cela ne remplacerait-il pas les zéros avec 0? Pas ce que je cherche du tout! – TheSoftwareJedi

+0

S'installer, Beavis. J'ai écrit que cela PEUT vous être utile ... juste une idée. Vous faites un bon point sur les zéros. – Alan

-1

Une alternative:

SELECT 
    MAX(col1) KEEP (DENSE_RANK LAST ORDER BY row_priority), 
    MAX(col2) KEEP (DENSE_RANK LAST ORDER BY row_priority), 
    MAX(col3) KEEP (DENSE_RANK LAST ORDER BY row_priority) 
FROM the_table 

La perf L'expression de ceci peut être différente de la version analytique; Le meilleur ou le pire dépend de vos données et de votre environnement.

Questions connexes