2013-02-06 9 views
5

Ho un 2012 query SQL che mi dà i seguenti risultati:SQL - Come mostrare la differenza tra le file multiple risultati

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 

I risultati vanno a mostrare diversi paesi per le stesse date e le diverse percentuali.

Quello che ho bisogno di mostrare, è il movimento di quelle percentuali tra le date solo per lo stesso Paese.

Quindi tra 02/01 e 01/01 la differenza è 0.02 - posso estrarre i dati e farlo in excel, ma idealmente mi piacerebbe che i risultati risultassero con il movimento nella query.

+1

ti ha taggato questo come MySQL, ma che dici hai una query SQL 2012, quale database stai usando? – Taryn

+0

Scusa - il suo MS SQL Server 2012, utilizzando lo studio di gestione del server. – user2046878

+1

Nessun problema, vogliamo solo assicurarci di avere gli utenti giusti che guardano alla tua domanda. :) – Taryn

risposta

7

È possibile utilizzare LAG e LEAD per accedere alle righe precedenti e successive.

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

'LAG' non è un nome di funzione predefinito riconosciuto. – user2046878

+5

@ user2046878 - Allora non sei nel 2012. Per le versioni precedenti avresti bisogno di unirti su "ROW_NUMBER" o usare un CTE ricorsivo. –

2

Utilizzando CTE e violino @MartinSmith s'(DEMO). (Nota: ho formattato [ds] data per una migliore leggibilità)

;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

Un'altra opzione con ESTERNO applicare e EXISTS

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 

Demo SQLFiddle

Problemi correlati