Numéros courants

Les nombres courants sont, en termes simples, lorsque les nombres sont additionnés les uns aux autres. Comme si vous vouliez connaître les valeurs depuis le début de l'année (YTD). La sommation des nombres est peut-être un cas souvent utilisé, mais les possibilités ne s'y limitent pas. Vous pourriez aussi bien faire une moyenne mobile.

Pour ce cas, nous travaillons avec un exemple YTD. Supposons que nous ayons un tableau avec les revenus d'une certaine catégorie par mois.

ea_month    id       amount    ea_year    circle_id
April       92570    1000      2014        1
April       92571    3000      2014        2
April       92572    2000      2014        3
March       92573    3000      2014        1
March       92574    2500      2014        2
March       92575    3750      2014        3
February    92576    2000      2014        1
February    92577    2500      2014        2
February    92578    1450      2014        3   

Pour obtenir le total du mois jusqu'à présent, vous pourriez être tenté d'utiliser une sous-requête comme obtenir tout le montant des mois précédents de l'année en cours de mon produit. Cela fonctionne réellement, mais pour chaque ligne extraite, une sous-requête est exécutée. Ce qui peut facilement conduire à des milliers de requêtes et donc prendre des années comme cet exemple :

select branch_id,
       net_profit as store_profit,
       (select sum(net_profit) from store_sales as s2 where s2.city = s1.city) as city_profit,
       store_profit / city_profit * 100 as store_percentage_of_city_profit
    from store_sales as s1
    order by branch_id;
+-----------+--------------+-------------+---------------------------------+
| BRANCH_ID | STORE_PROFIT | CITY_PROFIT | STORE_PERCENTAGE_OF_CITY_PROFIT |
|-----------+--------------+-------------+---------------------------------|
|         1 |     10000.00 |    25000.00 |                     40.00000000 |
|         2 |     15000.00 |    25000.00 |                     60.00000000 |
|         3 |     10000.00 |    19000.00 |                     52.63157900 |
|         4 |      9000.00 |    19000.00 |                     47.36842100 |
+-----------+--------------+-------------+---------------------------------+

Postgres fournit une fonction dite de fenêtre appelée OVER. Donc, dans un langage moins naturel, vous dites en SQL que vous voulez avoir un sum() SUR un ensemble de données PARTITIONNÉ par temps et/ou produit.

SELECT ea_month, id, amount, ea_year, circle_id
     , sum(amount) OVER (PARTITION BY circle_id
                         ORDER BY ea_year, ea_month) AS cum_amt
FROM   tbl
ORDER  BY circle_id, month;

Pour avoir réellement un YTD, l'année doit faire partie de la PARTITION, sinon ce sera fini de tous les temps.

Le calcul se fera par ligne. Donc, si le tableau contient des données quotidiennes, mais que la sortie est souhaitée sur une base mensuelle, les données doivent d'abord être regroupées et résumées par mois, avant qu'un ytd sur une base mensuelle ne fonctionne.