आपको अनिवार्य रूप से अस्थायी रूप से यह दिखावा करने की आवश्यकता है कि c2.reading 1,000,000 तक पहुंचने के बाद, और केवल c2.reading < c1.reading के बाद ही समाप्त नहीं हुआ . यानी, उस समय आपको c2.reading increase को बढ़ाना होगा 1,000,000 तक घटाएं, फिर c1.reading subtract घटाएं . और जब c2.reading >= c1.reading , क्वेरी को "सामान्य" अंतर की गणना करनी चाहिए, यानी घटाना c1.reading मूल से (गैर-बढ़ी हुई) c2.reading मूल्य।
उस तर्क को हासिल करने का एक तरीका यह होगा कि कुछ इस तरह से सीधा किया जाए:
SUM(
CASE WHEN c2.reading < c1.reading THEN 1000000 ELSE 0 END
+ c2.reading
- ISNULL(c1.reading, c2.reading)
) AS Count1
हालांकि, एक अलग तरीका भी है।
आपके पढ़ने के मूल्य, और परिणामस्वरूप, उनमें से किन्हीं दो के बीच का अंतर भी कभी भी 1,000,000 से अधिक नहीं हो सकता है। इसलिए, आप स्वतंत्र रूप से modulo अप्लाई कर सकते हैं। 1,000,000 का एक सकारात्मक अंतर और वह आपको वही अंतर वापस देगा:
d mod 1,000,000 = d
इसके अलावा, सकारात्मक अंतर में 1,00,000 के गुणकों को जोड़ने से मॉडुलो 1,000,000 के परिणाम पर कोई प्रभाव नहीं पड़ेगा क्योंकि, मॉडुलो ऑपरेशन के वितरण के अनुसार,
(d + 1,000,000 * n) mod 1,000,000 =
= d mod 1,000,000 + (1,000,000 * n) mod 1,000,000
पहला सारांश, d mod 1,000,000 d . में परिणाम , दूसरा वाला, (1,000,000 * n) mod 1,000,000 पैदावार 0, d + 0 = d ।
दूसरी ओर, 1,000,000 को नकारात्मक . में जोड़ना अंतर हमें एक सही सकारात्मक अंतर देगा।
तो, संक्षेप में,
-
1,000,000 को ऋणात्मक अंतर में जोड़ने पर हमें एक (सही) सकारात्मक अंतर मिलता है,
-
एक सकारात्मक अंतर मॉड्यूलो 1,000,000 समान सकारात्मक अंतर उत्पन्न करता है, और
-
सकारात्मक अंतर में 1,000,000 जोड़ने से मॉडुलो 1,000,000 का परिणाम प्रभावित नहीं होता है।
इन सभी बातों को ध्यान में रखते हुए, हम एक अंतर की गणना करने के लिए निम्नलिखित सार्वभौमिक अभिव्यक्ति प्राप्त कर सकते हैं:
(1000000 + c2.reading - ISNULL(c1.reading, c2.reading)) % 1000000
जहां % मॉडुलो ऑपरेटर है Transact में- एसक्यूएल
।
व्यंजक को SUM . में डालें संबंधित समेकित मान प्राप्त करने के लिए:
SUM((c2.reading + 1000000 - ISNULL(c1.reading, c2.reading)) % 1000000) AS Count1