2015-02-12 57 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表表达式中执行差异操作。最后的外部查询只是将每个行值的差值相加。