আগের সারিতে মোট চলমান


14

উইন্ডোটিং ফাংশনগুলির সাথে আমার কিছু সহায়তা দরকার। আমি জানি আপনি একটি উইন্ডোর মধ্যে যোগফল এবং উইন্ডোর মধ্যে চলমান মোট গণনা করতে পারেন। তবে বর্তমানের সারিটি সহ মোট চলমান মোট অর্থাত্ চলমান মোট গণনা করা কি সম্ভব?

আমি ধরে নিলাম আপনার পক্ষে যুক্তি ROWবা RANGEতর্কটি ব্যবহার করা দরকার । আমি জানি একটি CURRENT ROWবিকল্প আছে তবে আমার প্রয়োজন হবে CURRENT ROW - 1যা অবৈধ সিনট্যাক্স। আমার ROWএবং RANGEতর্কগুলি সম্পর্কে জ্ঞান সীমিত তাই কোনও কৃতজ্ঞতা সহকারে গৃহীত হবে।

আমি জানি এই সমস্যার অনেক সমাধান আছে, কিন্তু আমি বুঝতে খোঁজ করছি ROW, RANGEআর্গুমেন্ট এবং আমি সমস্যা এই সঙ্গে কর্কশ করা যাবে অনুমান। আমি পূর্বের চলমান মোট গণনা করার একটি সম্ভাব্য উপায় অন্তর্ভুক্ত করেছি তবে আরও ভাল উপায় আছে কিনা তা অবাক করে দিয়েছি:

USE AdventureWorks2012

SELECT s.SalesOrderID
    , s.SalesOrderDetailID
    , s.OrderQty
    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID) AS RunningTotal
    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
                         ORDER BY SalesOrderDetailID) - s.OrderQty AS PreviousRunningTotal
    -- Sudo code - I know this does not work
    --, SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
    --                   ORDER BY SalesOrderDetailID
    --                   ROWS BETWEEN UNBOUNDED PRECEDING 
    --                                   AND CURRENT ROW - 1) 
    -- AS  SudoCodePreviousRunningTotal
FROM Sales.SalesOrderDetail s
WHERE SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY s.SalesOrderID
    , s.SalesOrderDetailID 
    , s.OrderQty

উত্তর:


22

উত্তরটি ব্যবহার করা হয় 1 PRECEDING, না CURRENT ROW -1। সুতরাং, আপনার ক্যোয়ারিতে, ব্যবহার করুন:

    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID 
                            ORDER BY SalesOrderDetailID
                            ROWS BETWEEN UNBOUNDED PRECEDING 
                                     AND 1 PRECEDING) 
    AS  PreviousRunningTotal

আপনার অন্যান্য গণনায় এটিও নোট করুন:

    , SUM(s.OrderQty) OVER (PARTITION BY  SalesOrderID
                            ORDER BY SalesOrderDetailID) ...

এসকিউএল-সার্ভার ডিফল্ট * ব্যবহার করে RANGE UNBOUNDED PRECEDING AND CURRENT ROW। আমি মনে করি যে কার্যকারিতা পার্থক্য রয়েছে এবং ROWS UNBOUNDED PRECEDING AND CURRENT ROWএটি পছন্দ করা উচিত (অবশ্যই পরীক্ষার পরে এবং যদি এটি আপনার পছন্দমতো ফলাফল দেয়)।

পারফরম্যান্স টেস্ট সহ অ্যারন বার্ট্র্যান্ডের ব্লগ নিবন্ধে আপনি আরও অনেক বিবরণ পেতে পারেন : মোট রান করার জন্য সেরা পন্থা - এসকিউএল সার্ভার ২০১২-এর জন্য আপডেট

* এটি অবশ্যই ডিফল্ট পরিসীমা যখন কোনও ক্লজের ORDER BYঅভ্যন্তরে উপস্থিত থাকে OVER- অন্যথায়, ORDER BYডিফল্ট ছাড়া পুরো বিভাজন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.