Firebird SQL, Statystyka obliczenia

0

Proszę o pomoc w sformułowaniu zapytania. Mam tabelę odczytów z danymi:
ODCZYT [id, czas, dystans, {przyrost}]
1, 12:00, 1501, ...
2, 13:10, 1502, {1}
3, 14:25, 1504, {2}
4, 15:45, 1509, {5}

są to kolejne odczyty przebytej odległości, które są wartościami niemalejącymi. Każda kolejna wartość dystansu jest większa o "przyrost" , który jest różnicą pomiędzy dwoma sąsiednimi odczytami. Niestety nie mam w tej tabeli kolumny "przyrost", dlatego zaznaczyłem ją w tym przykładzie tylko poglądowo nawiasem klamrowym {...} tak jakby była.
Potrzebuję wyznaczyć statystyczną częstość występowania "przyrostów", czyli na wybranej grupie np. 100 odczytów znaleźć ile mam przyrostów o wartości 1, 2, 3, 4, ....itd. np. do 10
Do obliczenia częstości występowania mam już sprawdzone poniższe zapytanie:

SELECT FIRST 10 przyrost, COUNT( * )
FROM odczyt
GROUP BY przyrost
ORDER BY COUNT( * ) DESC

ale ono działa tylko jeśli w tablicy mam kolumnę "przyrost", a ja jej nie mam i nie chcę dodawać do tej tabeli.

Pytanie moje czy miałby ktoś pomysł jak sformułować zapytanie na tabeli ODCZYT tak aby uzyskać potrzebny wynik?

0
select 
  dystans,count(dystans) 
from 
 (
  select 
    (odczyt-coalesce((select first 1 odczyt from odczyty a where a.czas<ODCZYTY.czas order by czas desc),0)) as dystans 
  from 
    odczyty
  )
group by dystans
0
grzegorz_so napisał(a):
select 
  dystans,count(dystans) 
from 
 (
  select 
    (odczyt-coalesce((select first 1 odczyt from odczyty a where a.czas<ODCZYTY.czas order by czas desc),0)) as dystans 
  from 
    odczyty
  )
group by dystans

Długo analizowałem twoją podpowiedź i zanim zadziałało to znalazłem kilka błędów. Powinno być:

SELECT
  przyrost,COUNT(przyrost) 
FROM
 (
  SELECT
    (dystans-COALESCE((SELECT FIRST 1 dystans FROM odczyty a WHERE a.czas<ODCZYTY.czas ORDER BY czas DESC),0)) AS przyrost 
  FROM
    odczyty
  )
GROUP BY przyrost
ORDER BY COUNT(przyrost) DESC

Działa również bez COALESCE.

0

@jwalentek:
Prawdę mówiąc oprócz warunku order nie widzę żadnej różnicy.
Coalesce jest potrzebne, ponieważ najstarszy (pierwszy w tabeli) zapis nie posiada poprzednika i podzapytanie zwróci wartość null

0

kolega napisał:

..select  (odczyt-coalesce((select first 1 odczyt from...

a powinno być:

...select (dystans-coalesce((select first 1 dystans from...

A propos COALESCE to własnie chodzi o to, że ten pierwszy rekord zaburza mi wynik bo, mam takie dane w tabeli (Kolumnę "przyrost" dodałem tu tylko kontrolnie):
title
i z COALESCE otrzymuję poniższy wynik, i pojawia mi się przyrost 100 jakoby występował 1 raz:
title
a bez COALESCE mam, i to jest chyba dla mnie lepsze:
title

1

@jwalentek:

..select (odczyt-coalesce((select first 1 odczyt from...
a powinno być:
...select (dystans-coalesce((select first 1 dystans from...

czy to ma być ten znaleziony przez Ciebie błąd ?? :)
co do Colelesce to sprawa jest dyskusyjna ponieważ nie okresliłeś w jaki sposób zdefiniować przyrost dla pierwszego zapisu

0

... błąd - nie błąd, nie chciało działać, więc długo się zastanawiałem dlaczego tak napisałeś.
W każdym razie dzięki bardzo za podpowiedź.
Teraz trochę po omacku muszę to przerobić na składnię MySQL, mimo że nie programowałem nigdy tej bazy. To takie finalne zadanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1