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.