Calculare diferenta intre 2 randuri in sql

In baza de date, inserez randuri o data la 5 minute. Avand timestamp-urile vreau sa calculez diferenta intre randul curent si randul precedent curent - previous

Tabelul are urmatoarele date. Ignorati secunda si milisecunda.

231 433 2020-03-22 14:07:36.661664
296 433 2020-03-22 19:55:00.324456
297 433 2020-03-22 20:00:00.363889
298 440 2020-03-22 20:05:00.321905
299 433 2020-03-22 20:10:00.336552
300 433 2020-03-22 20:20:00.399065
301 433 2020-03-22 20:25:00.233915

De calculat diferenta, am calculat-o cu query (cu putin Google :grin: ) De asemenea id-urile nu sunt neaparat in ordine.

select curr.date, (curr.cases - prev.cases) as delta,
curr.cases, prev.cases
from rocases curr
left join rocases prev
on prev.date = (
select max(roc.date)
    from rocases roc
    where roc.date < curr.date
)
group by delta
order by curr.date;

Si afiseaza tabelul de mai jos.
image


Sunt curios ce alte idei mai sunt.
Eu am facut pentru Mysql 5.7, dar subiectul nu este limitat doar la el. Poate fi orice dialect sql pentru orice baza de date. :slight_smile:

PS: Sky is the limit! :slight_smile:

O alta varianta este sa adaugi o noua coloana delta iar in momentul insert-ului ii calculezi valoarea: current_cases - previous_cases. In acest fel query-ul pentru select este mai simplu.

3 Likes

este si o optimizare importanta de incarcare a sistemului pentru ca scrierea o faci o singura data… pe cand citirea o faci in principiu de multe ori.

Raspuns scurt: 5 minute este diferenta (tu ai zis-o :P)
Raspuns scurt + 10sec: subquery pentru a determina diferenta. Nu vad rostu la complicaciunea aia cu left join si max si grupare si etc.

In SQLServer ai window functions pentru ceva de genu:

SELECT [Id]
      ,[Time]
      ,[Cases]
	  ,[Cases] - LAG(CASES,1) over (order by [Time]) as Delta 
  FROM [Test].[dbo].[rocases]

windowfct

1 Like

Da
Merge si cu lag

 select 
 cases, date,
 (cases - lag(cases, 1) over (order by date)) as delta 
 from rocases

image