Query differenza campo precedente

mercoledì 02 maggio 2012 - 09.13

dotnetnapo Profilo | Junior Member

Ciao a tutti, sto impazzendo su una query MYSQL, il campo contiene coordinate google map per cui sono accettati anche numeri negativi, visualizzo la tabella per capirci meglio,

ID | CAMPO
--------------
1 | 20
2 | 35
3 | 12
4 | 25
5 | 40
6 | 50
7 | 22

Data la tabella precedente, come faccio ad ottenere una query in cui il primo record è 0 e dal secondo in poi ogni campo è la differenza con il precedente? Cioè:

ID | CAMPO
--------------
1 | 0
2 | 15
3 | -23
4 | 23
5 | 15
6 | 10
7 | -28

Mi andrebbe bene anche ottenere una query di questo tipo:

ID | CAMPO1 | CAMPO
----------------------------
1 | 0 | 20
2 | 20 | 35
3 | 35 | 12
4 | 12 | 25
5 | 25 | 40
6 | 40 | 50
7 | 50 | 22

in cui il CAMPO1 è il record precedente di CAMPO

E' possibile farlo? Grazie

renarig Profilo | Expert

Si e possibile,


Ho ripescato dal mio "Archivio" un vecchio DB
da cui potresti prendere spunto


Ripropongo il problema a cui ha risposto:



__ Dato un punto temporale di partenza
__ Dati dei periodi in minuti dalla partenza ( anche non consecutivi )
__ Date le letture di temperatura ad ogni "battere" del periodo



Trovare i delta di temperatura fra tutti i periodi adiacenti.




Guardati lo script allegato che in SQLServer ( dovrai tradurlo in MySql )

1)__ Ti Crea il DB

2)__ Ti Crea la tabella

3)__ Ti Inserisce i dati

4)__ Ti fa 2 Viste X01 e X05 che utilizzando RowNumber
arrivano al risultato

5)__ Ti fa altre 3 viste Y01 Y03 e Y05 che utilizzandi
i Join arrivano allo stesso risultato



NB: Non so se in MySql hai la funzione RowNumber
alla peggio vai direttamente al punto 5 dei Join



-- 1) Creo il DB CREATE DATABASE Lett; GO -- Uso il DB appena creato USE Lett; GO -- 2) Creo una tabella CREATE TABLE [dbo].[Le] ( [LeMin] [int] PRIMARY KEY, [LeTem] [int] ); GO -- LeMin sono i Minuti Trascorsi -- LeTem sono le temperature registrate nell'istante -- 3) Inserisco un po di dati INSERT [dbo].[Le] ([LeMin], [LeTem]) VALUES (1, 20), (2, 35), (3, 12), (4, 25), (5, 40), (6, 50), (7, 22); GO -- 4) Creo la prima famiglia di viste a treno ( che potro nidificare ) -- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx CREATE VIEW [dbo].[X01] AS SELECT TOP (100) PERCENT LeMin, LeTem, ROW_NUMBER() OVER (ORDER BY LeMin) AS Ord FROM dbo.Le GO -- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx CREATE VIEW [dbo].[X05] AS SELECT X01Da.LeMin AS Dax, X01Da.LeTem AS LeDax, X01Al.LeMin AS Alx, X01Al.LeTem AS LeAlx, X01Al.LeTem - X01Da.LeTem AS Delta FROM dbo.X01 AS X01Da LEFT OUTER JOIN dbo.X01 AS X01Al ON X01Da.Ord = X01Al.Ord - 1 GO -- 5) Creo la seconda famiglia di viste a treno ( che potro nidificare ) -- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx CREATE VIEW [dbo].[Y01] AS SELECT TOP (100) PERCENT LeDa.LeMin AS Dax, LeAl.LeMin AS Alx FROM dbo.Le AS LeDa LEFT OUTER JOIN dbo.Le AS LeAl ON LeDa.LeMin < LeAl.LeMin GO -- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx CREATE VIEW [dbo].[Y03] AS SELECT TOP (100) PERCENT Dax, MIN(Alx) AS Alx FROM dbo.Y01 GROUP BY Dax ORDER BY Dax, Alx GO -- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx CREATE VIEW [dbo].[Y05] AS SELECT TOP (100) PERCENT dbo.Y03.Dax, LeDw.LeTem AS LeDax, dbo.Y03.Alx, LeAw.LeTem AS LeAlx, LeAw.LeTem - LeDw.LeTem AS Delta FROM dbo.Y03 LEFT OUTER JOIN dbo.Le AS LeAw ON dbo.Y03.Alx = LeAw.LeMin LEFT OUTER JOIN dbo.Le AS LeDw ON dbo.Y03.Dax = LeDw.LeMin ORDER BY dbo.Y03.Dax GO -- Finito


Facci Sapere

Saluti
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5