एसक्यूएल - एकाधिक पंक्तियों के बीच अंतर कैसे दिखाना है - एसक्यूएल, एसक्यूएल-सर्वर, एसक्यूएल-सर्वर -2012, स्लाइडिंग-विंडो

मेरे पास एक SQL 2012 क्वेरी है जो मुझे निम्न परिणाम देता है:

IP_Country  ds          Percentage
-------------------------------------
Australia   01/01/2013  0.70155
Australia   02/01/2013  0.685
Australia   03/01/2013  0.663594
Australia   04/01/2013  0.737541
Australia   05/01/2013  0.688212
Australia   06/01/2013  0.665384
Australia   07/01/2013  0.620253
Australia   08/01/2013  0.697183

परिणाम एक ही तारीख और विभिन्न प्रतिशत के लिए अलग-अलग देशों को दिखाने के लिए चलते हैं।

मुझे जो दिखाने की ज़रूरत है, वह केवल उसी देश की तिथियों के बीच उन प्रतिशतों का आंदोलन है।

तो 02/01 और 01/01 के बीच अंतर 0.02 है - मैं डेटा निकाल सकता हूं और इसे एक्सेल में कर सकता हूं, लेकिन आदर्श रूप से मैं क्वेरी में आंदोलन के साथ परिणाम प्राप्त करना चाहता हूं।

उत्तर:

उत्तर № 1 के लिए 7

आप उपयोग कर सकते हैं LAG तथा LEAD पिछले और अगली पंक्तियों तक पहुंचने के लिए।

SELECT *,
LAG([Percentage]) OVER (PARTITION BY [IP_Country] ORDER BY [ds])
- [Percentage] AS diff,
([Percentage] - LEAD([Percentage]) OVER (PARTITION BY [IP_Country] ORDER BY [ds]))
/ [Percentage] AS [ratio]
FROM  YourTable

एसक्यूएल फिडल


जवाब के लिए 2 № 2

का उपयोग करते हुए CTE और @ मार्टिनस्मिथ "बेवकूफ (डेमो)। (ध्यान दें: मैंने बेहतर पठनीयता के लिए [डीएस] दिनांक स्वरूपित किया है)

;with cte as (
select [IP_Country], [ds], [Percentage],
row_number() over (partition by [IP_Country] order by ds) rn
from YourTable
)
select t1.[IP_Country], convert(date, t1.[ds],102),
t1.[Percentage], t2.[Percentage]-t1.[Percentage] movement
from cte t1 left join cte t2 on t1.[IP_Country] = t2.[IP_Country]
t1.rn - 1 = t2.rn

--Results
IP_COUNTRY  COLUMN_1    PERCENTAGE  MOVEMENT
Australia   2013-01-01  0.70155     (null)
Australia   2013-02-01  0.685       0.01655
Australia   2013-03-01  0.663594    0.021406
Australia   2013-04-01  0.737541    -0.073947
Australia   2013-05-01  0.688212    0.049329
Australia   2013-06-01  0.665384    0.022828
Australia   2013-07-01  0.620253    0.045131
Australia   2013-08-01  0.697183    -0.07693

जवाब के लिए 0 № 3

बाहरी आवेदन और EXSTSTS के साथ एक और विकल्प

SELECT *, t1.Percentage - o.Percentage AS dif
FROM dbo.test36 t1
OUTER APPLY (
SELECT t2.Percentage
FROM dbo.test36 t2
WHERE t1.IP_Country = t2.IP_Country
AND EXISTS (
SELECT 1
FROM dbo.test36 t3
WHERE t1.IP_Country = t3.IP_Country AND t1.ds < t3.ds
HAVING MIN(t3.ds) = t2.ds
)
) o

पर डेमो SQLFiddle


संबंधित सवाल
सबसे लोकप्रिय