Vous pouvez le faire comme ceci:
Choisissez la partition dans laquelle vous souhaitez appliquer une décroissance exponentielle, puis ordre décroissant par date dans un tel groupe.
Utilisez la fonction ROW_NUMBER() avec l'ordre ascendant pour obtenir la numérotation des lignes dans chaque sous-groupe.
calculer pow (votre_variable_in_ [0,1], rownum) et l'appliquer à votre résultat.
code
pourrait ressembler à ceci (pourrait fonctionner dans Oracle SQL ou db2):
SELECT <your_partitioning>, date, <whatever>*power(<your_variable>,rownum-1)
FROM (SELECT a.*
, ROW_NUMBER() OVER (PARTITION BY <your_partitioning> ORDER BY a.date DESC) AS rownum
FROM YOUR_TABLE a)
ORDER BY <your_partitioning>, date DESC
EDIT: Je lis à nouveau sur votre problème et pense que je compris maintenant ce que vous avez demandé pour, alors voici une solution qui pourrait fonctionner (facteur de décroissance est 0,9 ici):
SELECT product, sum(adjusted_views) // (i)
FROM (SELECT product, views*power(0.9, rownum-1) AS adjusted_views, date, rownum // (ii)
FROM (SELECT product, views, date // (iii)
, ROW_NUMBER() OVER (PARTITION BY product ORDER BY a.date DESC) AS rownum
FROM YOUR_TABLE a)
ORDER BY product, date DESC)
GROUP BY product
L'instruction select intérieur (iii) crée une table temporaire qui pourrait ressembler à ceci
product views date rownum
--------------------------------------------------
a 1 2014-05-15 1
a 2 2014-05-14 2
a 2 2014-05-13 3
b 2 2014-05-10 1
b 3 2014-05-09 2
b 2 2014-05-08 3
b 1 2014-05-07 4
La requête suivante (ii) utilise ensuite la rownumber pour construire un facteur décroissance exponentielle 0,9^(rownum-1) et l'applique aux vues. Cependant, le résultat est
product adjusted_views date rownum
--------------------------------------------------
a 1 * 0.9^0 2014-05-15 1
a 2 * 0.9^1 2014-05-14 2
a 2 * 0.9^2 2014-05-13 3
b 2 * 0.9^0 2014-05-10 1
b 3 * 0.9^1 2014-05-09 2
b 2 * 0.9^2 2014-05-08 3
b 1 * 0.9^3 2014-05-07 4
Dans une dernière étape (la requête externe) les vues ajustées sont additionnées, comme cela semble être la quantité que vous souhaitez.
Notez que pour soyez cohérent il devrait y avoir des distances régulières entre les dates, par exemple, toujours le jour (- pas un jour ici et un mois là-bas, parce que ceux-ci seront pondérés d'une manière similaire, bien qu'ils ne devraient pas).
Connaissez-vous 'ORDER BY'? –