الأرقام الجارية

الأرقام الجارية هي، بعبارات بسيطة، عندما تُضاف الأرقام إلى بعضها البعض. مثل أن تريد معرفة القيم منذ بداية العام وحتى تاريخه. ربما يكون جمع الأرقام حالة مستخدمة في كثير من الأحيان، لكن الاحتمالات لا تقتصر عليها. يمكنك أيضًا إجراء متوسط متحرك.

في هذه الحالة سنعمل مع مثال منذ بداية العام حتى تاريخه. لنفترض أن لدينا جدول بإيرادات فئة معينة في الشهر.

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   

للحصول على إجمالي الشهر حتى الآن قد تميل إلى استخدام استعلام فرعي مثل الحصول على كل مبلغ الأشهر السابقة من السنة الحالية لمنتجي. إنه يعمل بالفعل، ولكن لكل صف يتم جلبه يتم تنفيذ استعلام فرعي. وهو ما يمكن أن يؤدي بسهولة إلى آلاف الاستعلامات وبالتالي يستغرق وقتًا طويلاً مثل هذا المثال:

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 ما يسمى بدالة نافذة تسمى OVER. لذا بلغة أقل طبيعية تخبر بلغة SQL أنك تريد أن يكون لديك مجموع () فوق مجموعة بيانات مقسمة حسب الوقت و/أو المنتج.

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;

لكي يكون لديك بالفعل سنة حتى تاريخه يجب أن تكون السنة جزءًا من التقسيم، وإلا فستكون على كل الوقت.

سيتم إجراء الحساب لكل صف. لذا، إذا كان الجدول يحتوي على بيانات يومية، ولكن الإخراج مطلوب على أساس شهري، فيجب تجميع البيانات وتلخيصها لكل شهر أولاً، قبل أن تعمل السنة حتى تاريخه على أساس شهري.