Laufende Zahlen
Laufende Zahlen sind, vereinfacht gesagt, wenn Zahlen miteinander addiert werden. Als ob Sie Year-to-Date (YTD)-Werte wissen möchten. Das Summieren von Zahlen ist vielleicht ein oft verwendeter Fall, aber die Möglichkeiten sind nicht darauf beschränkt. Sie könnten genauso gut einen gleitenden Durchschnitt berechnen.
Für diesen Fall arbeiten wir mit einem YTD-Beispiel. Nehmen wir an, wir haben eine Tabelle mit den Einnahmen für eine bestimmte Kategorie pro Monat.
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
Um die Gesamtsumme des Monats bis jetzt zu erhalten, könnten Sie versucht sein, eine Unterabfrage zu verwenden, wie z. B. alle Beträge der vorherigen Monate des aktuellen Jahres meines Produkts abrufen. Es funktioniert tatsächlich, aber für jede abgerufene Zeile wird eine Unterabfrage ausgeführt. Was leicht zu Tausenden von Abfragen führen kann und daher Ewigkeiten dauern kann, wie in diesem Beispiel:
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 bietet eine sogenannte Fensterfunktion namens OVER. In einer weniger natürlichen Sprache sagen Sie also in SQL, dass Sie eine Summe () über einem Datensatz haben möchten, der nach Zeit und / oder Produkt PARTITIONIERT ist.
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;
Um tatsächlich ein YTD zu haben, muss das Jahr Teil der PARTITION sein, sonst ist es für immer vorbei.
Die Berechnung erfolgt pro Zeile. Wenn die Tabelle also Tagesdaten enthält, aber die Ausgabe auf Monatsbasis gewünscht wird, dann müssen die Daten zuerst gruppiert und pro Monat aufsummiert werden, bevor eine ytd auf Monatsbasis funktionieren würde.