2014-05-15 3 views
0

J'ai des dates différentes avec la quantité de produits consultés sur une page Web sur une période de 30 jours. J'essaie de créer un modèle de désintégration exponentielle en SQL. J'utilise la décroissance exponentielle parce que je veux mettre en évidence les derniers événements par rapport aux plus anciens. Je ne sais pas comment écrire cela en SQL sans avoir d'erreur. Je n'ai jamais fait cela auparavant avec ce type de modèle, donc je veux m'assurer que je le fais aussi correctement.La désintégration exponentielle dans SQL pour différentes dates vues de la page

================================= données ressemble à ce

product  views date 

    a   1  2014-05-15 
    a   2  2014-05-01 
    b   2  2014-05-10 
    c   4  2014-05-02 
    c   1  2014-05-12 
    d   3  2014-05-11 

= ===============================

code:

create table decay model as 
select product,views,date 
case when...... 
from table abc 
group by product; 

ne sais pas quoi écrire à faire le modèle

Je veux pénaliser les produits qui étaient Visionnée qui étaient plus âgés vs produits qui vous ont été visionnées plus récemment

Merci pour votre aide

+0

Connaissez-vous 'ORDER BY'? –

Répondre

0

Vous pouvez le faire comme ceci:

  1. Choisissez la partition dans laquelle vous souhaitez appliquer une décroissance exponentielle, puis ordre décroissant par date dans un tel groupe.

  2. Utilisez la fonction ROW_NUMBER() avec l'ordre ascendant pour obtenir la numérotation des lignes dans chaque sous-groupe.

  3. 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).

+0

Je suis confus par la ligne quelle qu'elle soit. Qu'est-ce que cela veut dire/référencer aussi? – user3120266

+0

Cela signifie ce que vous voulez appliquer votre facteur de décroissance exponentielle. Dans votre cas, il pourrait s'agir de vues. J'ai édité la réponse pour espérer résoudre votre problème. – davidhigh

Questions connexes