गैर-संबंधपरक समाधान
मुझे नहीं लगता कि कोई अन्य उत्तर सही है।
-
GROUP BY
काम नहीं करेगा -
ROW_NUMBER()
का उपयोग करना डेटा को एक रिकॉर्ड फाइलिंग सिस्टम संरचना में बाध्य करता है, जो भौतिक है, और फिर इसे भौतिक रिकॉर्ड के रूप में संसाधित करता है। बड़े पैमाने पर प्रदर्शन लागत पर। बेशक, ऐसा कोड लिखने के लिए, यह आपको सोचने . के लिए मजबूर करता है संबंधपरक शब्दों में सोचने के बजाय RFS के संदर्भ में। -
सीटीई का उपयोग करना वही है। डेटा के माध्यम से पुनरावृत्ति, विशेष रूप से डेटा जो नहीं बदलता है। थोड़ी अलग भारी कीमत पर।
-
विभिन्न कारणों से कर्सर निश्चित रूप से गलत चीज हैं। (ए) कर्सर को कोड की आवश्यकता होती है, और आपने एक दृश्य का अनुरोध किया है (बी) कर्सर सेट-प्रोसेसिंग इंजन को छोड़ देते हैं, और पंक्ति-दर-पंक्ति प्रसंस्करण पर वापस आ जाते हैं। फिर से, आवश्यकता नहीं है। अगर मेरी किसी टीम का कोई डेवलपर रिलेशनल डेटाबेस (यानी रिकॉर्ड फाइलिंग सिस्टम नहीं) पर कर्सर या टेम्प टेबल का उपयोग करता है, तो मैं उन्हें शूट करता हूं।
संबंधपरक समाधान
-
आपका डेटा संबंधपरक, तार्किक है, दो दिए गए डेटा कॉलम सभी आवश्यक हैं।
-
निश्चित रूप से, हमें वांछित रिपोर्ट प्राप्त करने के लिए एक दृश्य (व्युत्पन्न संबंध) बनाना होगा, लेकिन इसमें शुद्ध चयन शामिल हैं, जो प्रसंस्करण के लिए काफी अलग है (इसे फ़ाइल में परिवर्तित करना) , जो भौतिक है, और फिर फ़ाइल . को संसाधित कर रहा है; या अस्थायी टेबल; या वर्कटेबल्स; या सीटीई; या ROW_Number (); आदि)।
-
"सैद्धांतिक" के विलाप के विपरीत, जिनके पास एक एजेंडा है, SQL रिलेशनल डेटा को पूरी तरह से संभालता है। और आपका डेटा रिलेशनल है।
इसलिए, एक संबंधपरक मानसिकता, डेटा का एक संबंधपरक दृष्टिकोण और एक सेट-प्रोसेसिंग मानसिकता बनाए रखें। एक रिलेशनल डेटाबेस पर प्रत्येक रिपोर्ट आवश्यकता को एक एकल चयन का उपयोग करके पूरा किया जा सकता है। 1970 से पहले के ISAM फ़ाइल प्रबंधन विधियों को वापस लेने की कोई आवश्यकता नहीं है।
मैं मान लूंगा कि प्राथमिक कुंजी (स्तंभों का समूह जो एक संबंधपरक पंक्ति विशिष्टता देता है) Date,
है और दिए गए उदाहरण डेटा के आधार पर, डेटाटाइप DATE.
. है
इसे आजमाएं:
CREATE VIEW MyTable_Base_V -- Foundation View
AS
SELECT Date,
Date_Next,
Price
FROM (
-- Derived Table: project rows with what we need
SELECT Date,
[Date_Next] = DATEADD( DD, 1, O.Date ),
Price,
[Price_Next] = (
SELECT Price -- NULL if not exists
FROM MyTable
WHERE Date = DATEADD( DD, 1, O.Date )
)
FROM MyTable MT
) AS X
WHERE Price != Price_Next -- exclude unchanging rows
GO
CREATE VIEW MyTable_V -- Requested View
AS
SELECT [Date_From] = (
-- Date of the previous row
SELECT MAX( Date_Next ) -- previous row
FROM MyTable_V
WHERE Date_Next < MT.Date
),
[Date_To] = Date, -- this row
Price
FROM MyTable_Base_V MT
GO
SELECT *
FROM MyTable_V
GO
विधि, सामान्य
बेशक यह एक विधि है, इसलिए यह सामान्य है, इसका उपयोग From_
. को निर्धारित करने के लिए किया जा सकता है और To_
किसी भी डेटा श्रेणी का (यहां, एक Date
रेंज), किसी भी डेटा परिवर्तन के आधार पर (यहां, Price
. में बदलाव )
यहां, आपकी Dates
क्रमागत हैं, इसलिए Date_Next
. का निर्धारण आसान है:Date
बढ़ाएँ 1 दिन तक। अगर PK बढ़ रहा है लेकिन नहीं लगातार (जैसे. DateTime
या TimeStamp
या कोई अन्य कुंजी), व्युत्पन्न तालिका बदलें X
करने के लिए:
-- Derived Table: project rows with what we need
SELECT DateTime,
[DateTime_Next] = (
-- first row > this row
SELECT TOP 1
DateTime -- NULL if not exists
FROM MyTable
WHERE DateTime > MT.DateTime
),
Price,
[Price_Next] = (
-- first row > this row
SELECT TOP 1
Price -- NULL if not exists
FROM MyTable
WHERE DateTime > MT.DateTime
)
FROM MyTable MT
आनंद लें।
कृपया बेझिझक टिप्पणी करें, प्रश्न पूछें, आदि।