2013-02-06 8 views
5

मैं एक 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

पर आप MySQL के रूप में इस टैग किए गए लेकिन आप कहते हैं आपके पास एक SQL 2012 क्वेरी है, आप किस डेटाबेस का उपयोग कर रहे हैं? – Taryn

+0

क्षमा करें - सर्वर प्रबंधन स्टूडियो का उपयोग कर, इसका एमएस एसक्यूएल सर्वर 2012। – user2046878

+1

कोई समस्या नहीं, हम सिर्फ यह सुनिश्चित करना चाहते हैं कि आपको सही प्रश्न आपके उपयोगकर्ता को देख रहे हैं। :) – Taryn

उत्तर

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 

SQL Fiddle

+0

'एलएजी' एक मान्यता प्राप्त अंतर्निहित फ़ंक्शन नाम नहीं है। – user2046878

+5

@ user2046878 - आप 2012 में नहीं हैं। पिछले संस्करणों के लिए आपको 'ROW_NUMBER' पर स्वयं शामिल होना होगा या एक पुनरावर्ती सीटीई का उपयोग करना होगा। –

2

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

;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

एक और बाहरी के साथ विकल्प लागू और मौजूद

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

संबंधित मुद्दे