2017-10-19 9 views
2

J'ai besoin d'obtenir MAX VALUE à partir de la somme des quantités divisées par ANNÉE (Besoin d'écrire une requête Oracle).Oracle Query to rollup QTY par année - seulement 3 dernières années

Par exemple

ITEM_ID  ORG_ID  YEAR QTY 

    100   121  2015 10 
    100   121  2016 5 
    100   121  2017 8 
    101   146  2014 10 
    101   146  2015 11 
    101   146  2016 12 
    101   146  2017 13 

Ma sortie devrait ressembler à ceci: -

for Item_id 100,121 the max_avg should be max(10+5+8/3, 5+10/2, 10/1)... max (7.6, 7.5, 8) = 8
for Item_id 101,146 the max_avg should be (11+12+13/3, 12+13/2, 13/1)... max(11.5, 12, 12.5, 13) = 13... I should not consider 10+11+12+13/4. Je ne ai besoin l'AVG considèrent enroulé par 3 dernières années et assignez la valeur Max

ITEM_ID  ORG_ID  YEAR QTY MAX_AVG 

    100   121  2015 10 8 
    100   121  2016 5 8 
    100   121  2017 8 8 
    101   146  2014 10 13 
    101   146  2015 11 13 
    101   146  2016 12 13 
    101   146  2017 13 13 

Toute aide serait grandement appréciée.

+0

Est-ce que la sortie désirée? Comment ID 101, année 2016, reçoit la valeur 13 dans la nouvelle colonne? Si ce n'est pas la sortie désirée, veuillez éditer pour montrer la (bonne) sortie désirée. En particulier, pour ID 101 (par exemple), que faut-il montrer pour 2014 et 2015, alors qu'il n'y a pas trois ans à considérer? Peut-être pour 2014 montrer juste la QTÉ (10), et pour 2015 montrer le maximum de 11/1 et (10 + 11)/2? Si non, quoi d'autre? – mathguy

+1

Aussi: quelle est votre version d'Oracle, telle que rapportée par 'select * from v $ version'? – mathguy

+0

@mathguy - la version est Oracle Database 12c édition Enterprise Edition 12.1.0.2.0 - 64bit Production – beckham

Répondre

1
select item_id, org_id, yr, qty, 
     greatest (
avg(case when yr = 2017    then qty end) over (partition by item_id, org_id), 
avg(case when yr in (2016, 2017)  then qty end) over (partition by item_id, org_id), 
avg(case when yr in (2015, 2016, 2017) then qty end) over (partition by item_id, org_id) 
     ) as max_avg 
from inputs_table 
; 
+0

cela a fonctionné.J'ai changé la requête pour être plus dynamique.:) 'sélectionner item_id, org_id, yr, qté, plus grand ( ) (cas où yr = (sélectionnez to_char (sysdate, 'YYYY') à partir de dual) puis qty end) over (partition par item_id, org_id), avg (cas où yr> = (sélectionnez to_char (sysdate, 'YYYY') - 1 à partir de dual) puis qty end) over (partition par item_id, org_id), moy (cas où yr> = (sélectionnez to_char (sysdate, 'YYYY') - 2 à partir de dual) puis qty end) sur (partition par item_id, org_id) ) comme max_avg de inputs_table ; ' – beckham

+0

@beckham - Cool - vous avez eu l'idée exactement à droite. – mathguy

2

Une méthode utilise deux niveaux de fonctions analytiques:

select t.*, max(running_avg_3) over (partition by item_id) 
from (select t.*, 
      avg(qty) over (partition by item_id order by year desc 
          rows between current row and 2 following 
          ) as running_avg_3 
     from t 
    ) t 
+0

Ce n'est pas ce que le PO recherche. Dans une "partition" il ne regarde que les moyennes sur 2017, 2017 et 2016, et 2017, 2016 et 2015. Ce "plus grand des trois moyennes" est utilisé pour TOUTES les années, y compris pour 2011 et 2012 et 2013. Il n'est pas expliqué très clairement dans le message original, mais il est clarifié dans les commentaires – mathguy

+0

@ Gordon - Je pensais que cette requête va fonctionner, mais il n'a toujours pas fonctionné et son calcul pour 2014. – beckham

+0

@beckham ... La clause de fenêtrage a besoin aller dans l'autre sens - 2 suivant plutôt que 2. –