Может ли кто-нибудь сказать мне, как рассчитать разницу между строками одного и того же столбца?

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 на некоторую дату, скажем, 02.12.2015, например, (12-10 = 2) (20-12 = 8) (19-2 = -1) и хочу суммировать эту разницу, т.е. 2+8+(-1)=9

-1
Swapnil Chikhale 12 Фев 2015 в 10:18
1
Какую СУБД вы используете?
 – 
Mahesh
12 Фев 2015 в 10:22
1
Два уточняющих вопроса: 1. Не могли бы вы добавить вывод, который вы пытаетесь получить? 2. Какую СУБД вы используете?
 – 
Mureinik
12 Фев 2015 в 10:24
1
Добавьте желаемый результат..т.е. что вы хотите здесь?
 – 
Shekhar Pankaj
12 Фев 2015 в 10:24
1
Я использую MS Access.
 – 
Swapnil Chikhale
12 Фев 2015 в 10:26

2 ответа

Если вы используете MS Access, я попробовал этот код для вашего вопроса: мне было сделано 4 запроса в MS Access: Query1 для получения данных deviceId=2 и date=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

И затем окончательный запрос, чтобы получить сумму из разницы результатов в query3:

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
Fauzi88 12 Фев 2015 в 11:55

Вы можете попробовать это (замените Table1 именем вашей таблицы):

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;

Выражение таблицы идентификаторов вычисляет предыдущий идентификатор для рассматриваемого идентификатора устройства. (Я поместил предложение WHERE в это табличное выражение, но вы можете переместить его во внешнее, если хотите вычислить FinalReadings для ВСЕХ устройств сразу, отфильтровать его в конце. Менее эффективно, но более гибко.) Мы присоединяемся обратно к исходным таблицам по ID и PrevID из выражений внутренней таблицы, получить их значения Reading и выполнить операцию разности в табличном выражении Diffs. Окончательный внешний запрос просто суммирует значения Difference для каждого значения строки.

0
VBlades 13 Фев 2015 в 00:04