2015-02-12 72 views
-1

任何人都可以告訴我如何計算同一列的行之間的差異?sql查詢 - 同一列的行值之間的差異

ID DeviceID  Reading  Date   Flag 
1  2   10   12/02/2015  1 
2  3   08   12/02/2015  1 
3  2   12   12/02/2015  1 
4  2   20   12/02/2015  0 
5  4   10   12/02/2015  0 
6  2   19   12/02/2015  0 

在上面的表欲計算的DeviceID 2對於一些日的讀數之間的差值表示2015年12月2日,例如, (12-10 = 2) (20-12 = 8) (19-2 = -1),並要總結這種差異 即2 + 8 +( - 1)= 9

+1

您正在使用哪個DBMS? – 2015-02-12 07:22:29

+1

兩個澄清問題:1.你可以添加你想要得到的輸出嗎? 2.您使用的是什麼RDBMS? – Mureinik 2015-02-12 07:24:20

+1

添加一些所需的輸出..你在這裏想要什麼? – 2015-02-12 07:24:50

回答

0

如果您使用的MS Access,我試試這個代碼,你的問題: 我在MS Access中做了4個查詢: Query1獲取數據deviceId = 2和日期= 12/2/2015:

select id, reading from table1 where deviceid=2 and date=#12/2/2015#; 

然後我讓QUERY2從QUERY1得到行號:

select 
(select count(*) from query1 where a.id>=id) as rowno, 
a.reading from query1 a; 

然後我讓QUERY3得到差值場從QUERY2閱讀:

select 
(tbl2.reading-tbl1.reading) as diff 
from query2 tbl1 
left join query2 tbl2 on tbl1.rowno=tbl2.rowno-1 

然後最終查詢從中獲取總和結果區別在查詢3:

SELECT sum(diff) as Total_Diff 
FROM Query3; 

但是,如果您使用SQL Server,則可以使用此查詢(查找示例sqlfiddle):

;with tbl as(
select row_number()over(order by id) as rowno, 
reading 
from table1 
where deviceid=2 and date='20150212' 
) 
select sum(diff) as sum_diff 
from (
select 
(b.reading-a.reading) as diff 
from tbl a 
left join tbl b on a.rowno=b.rowno-1 
) tbl_diff 
0

你可以試試這個(與你的表名稱替換表1):

SELECT Sum([Diffs].[Difference]) AS FinalReading 
FROM (
     SELECT IDs.DeviceID, [Table1].Reading AS NextReading, Table1_1.Reading AS PrevReading, [Table1].Reading-Table1_1.Reading AS Difference 
     FROM (
       (
        SELECT  [Table1].DeviceID, 
           [Table1].ID, 
           CLng(Nz(DMax("ID","Table1","[DeviceID] = " & [DeviceID] & " And [ID] < " & [ID]),0)) AS PrevID 
        FROM  Table1 
        WHERE  DeviceID = 2 
       ) AS IDs 
       INNER JOIN Table1 
       ON IDs.ID=[Table1].ID) 
       INNER JOIN Table1 AS Table1_1 
       ON IDs.PrevID=Table1_1.ID 
      ) AS Diffs; 

的標識表表達式計算上一個ID爲有關的DeviceID。 (我把WHERE子句放在這個表格表達式中,但是如果你想一次計算所有設備的FinalReadings,那麼你可以將它移動到外部,最後過濾它。效率較低但更靈活。)我們加入到內部表表達式中的ID和PrevID的原始表,獲取它們的讀取值,並在Diffs表表達式中執行差異操作。最後的外部查詢只是將每個行值的差值相加。