SQL Server
3.91K subscribers
27 photos
7 videos
36 files
172 links
حمید رضا صادقیان

🔴طراح‌ومشاوربانک های اطلاعاتیSQLSERVER
⚫️مدرس دوره های آموزشیDatabase

ارتباط با من:
@Hamidreza_Sadeghian

گروه تبادل نظر:
https://xn--r1a.website/+uIc1qhv58gU0NWQ0
Download Telegram
تا حالا Running Total تو SQL Server نوشتی و با خیال راحت رد شدی؟ 😌



📌 معمولاً برای Running Total یه چیزی شبیه این می‌نویسیم:


SUM(TotalDue) OVER (

PARTITION BY CustomerID

ORDER BY OrderDate

)



همه‌چیز هم ظاهراً درسته…

اما دقیقاً همین‌جا مشکل شروع میشه 😐

🔍 مشکل کجاست؟

وقتی داخل OVER فقط ORDER BY می‌نویسیم و چیز دیگه‌ای مشخص نمی‌کنیم،

خود SQL Server به‌صورت پیش‌فرض از این استفاده می‌کنه 👇



RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW



و این یعنی چی؟ 🤔

یعنی اگر تو ستون ORDER BY (مثلاً OrderDate) مقدار تکراری وجود داشته باشه:

اونقوت SQL Server تمام ردیف‌هایی که تاریخ یکسان دارن رو «یک ردیف منطقی» در نظر می‌گیره

و Running Total برای همه اون‌ها با هم محاسبه میشه

نتیجه؟

جمع یه‌هو می‌پره

😵‍💫 چیزی که حس می‌کنیم غلطه، ولی در واقع «غیرمنتظره» است


❗️ نکته مهم:

1- SQL Server اشتباه نکرده

2- ما ناخواسته رفتار RANGE رو فعال کردیم


🚀 راه‌حل درست و حرفه‌ای:

اگه Running Total واقعی می‌خوای، یعنی ردیف‌به‌ردیف و بدون پرش،

باید صریح بنویسی:



SUM(TotalDue) OVER (

PARTITION BY CustomerID

ORDER BY OrderDate

ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

)




یا حتی کوتاه‌تر:



ROWS UNBOUNDED PRECEDING




✔️ محاسبه دقیق

✔️ بدون رفتار عجیب

✔️ بازدهی خیلی بهتر (In-Memory به‌جای TempDB)




🧠 جمع‌بندی

همیشه Defaultها دوست ما نیستن

استفاده از RANGE فقط وقتی خوبه که عمداً بخوای Tieها یکی حساب بشن

برای ۹۹٪ سناریوهای Running Total → ROWS رو همیشه صریح بنویس



یه خط کداضافه ، ولی کلی تفاوت تو نتیجه و Performance 🔥

#SQLServer #TSQL #DBA #Performance #WindowFunctions #RunningTotal #DatabaseTips
👍148🔥2