Может ли кто-нибудь сказать мне, как рассчитать разницу между строками одного и того же столбца?
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
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
Вы можете попробовать это (замените 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 для каждого значения строки.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.