گروه بندی و تجمع را در گروه ها سفارش دهید – از SQL تا SPL شماره 1

توضیحات و تجزیه و تحلیل مشکل:
یک جدول خاص پایگاه داده ، چرخه پرداخت برای چندین پروژه (IDS) را توصیف می کند ، با یک چرخه پرداخت متشکل از ماه های منظم و یک ماه بسته شدن. ماه معمولی فقط مبلغ ماه جاری را دارد اما فاکتور ، صورتحساب = 0 ؛ ماه پایانی هم مبلغ ماه جاری و هم فاکتور ، فاکتور = 1 را شامل می شود.
وظیفه: اکنون باید هر ماه پرداخت را برای هر پروژه شناسایی کنیم و مبلغ کل آن چرخه پرداخت را محاسبه کنیم. توجه داشته باشید که معیارهای گروه بندی و ترتیب چرخه پرداخت مرتبط است ، یعنی “وقتی ماه گذشته صورتحساب = 1 ، گروه جدیدی را شروع کنید” ، که با گروه بندی هم ارزی مشترک متفاوت است.
مقایسه کد:
SQL:
WITH cte AS (
SELECT *, sum(invoiced) OVER (PARTITION BY ID ORDER BY Date desc) grp
FROM mytable
ORDER BY ID, Date
)
SELECT ID, MAX(date) AS Date, MAX(Invoiced) AS Invoiced, SUM(Amount) AS Amount
FROM cte
GROUP BY ID, grp
ORDER BY ID, Date
SQL دارای گروه بندی مستقیم با سفارش نیست ، باید با استفاده از توابع پنجره و زیرمجموعه ها ، یک ستون راهنما اضافه کند و سپس بر اساس ستون راهنما گروه و جمع شود. SQL فوق از روش سفارش معکوس و سپس تجمع برای جمع آوری ستون راهنما استفاده می کند که درک آن دشوار است.
چلپ چلوپ:
SPL از محاسبات مرتب شده مناسب پشتیبانی می کند ، و کد ساده است.
try.demo
داده های بار ، توجه داشته باشید که داده ها مرتب شده اند.
A2 : وقتی شناسه بدون تغییر باقی می ماند و ماه قبل یک ماه معمولی است ، مبلغ را به ارزش تجمعی تغییر دهید. در غیر این صورت (در ماه اول هر چرخه پرداخت) ، مبلغ را به مبلغ ماه جاری تنظیم کنید. [-1] رکورد قبلی را نشان می دهد.
Esproc SPR منبع باز است و اکنون در اینجا موجود است: آدرس منبع باز.