Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SOLVED] Średnia krocząca.
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
Blackhole
Witam smile.gif
Załóżmy, że mam taką tabelę:
Kod
id | liczby | srednia
---+--------+---------
1  | 100.03 |
2  | 104.83 |
3  | 107.46 |
4  | 103.29 |
5  | 106.71 |
6  | 110.02 |
7  | 109.74 |
Jak mam teraz wpisać automatycznie do kolumny srednia średnią kroczącą - powiedzmy długości 4 :?:
Podobno w czystym SQL-u nie da się tego zrobić dry.gif


----- Dodane -----
Podam bardziej szczegółowo, o co mi chodzi.
W 4 wierszu kolumny srednia chcę mieć wpisaną średnią z kolumny liczby z wierszy 1-4. W 5 wierszu chcę średnią z wierszy 2-5 (z kolumny liczby), itd.
DeyV
Tak - w czystym sql nie jest to możliwe.
Najłatwiej jednak byłoby to zrobić przy pomocy procedury wyswalanej, wywoływanej podczas dodawania nowego rekordu.

Można by spróbować również zaszaleć i spróbować to zrobić przy pomocy subzapytań. hmm.
Np. coś w stylu
  1. UPDATE srednie SET
  2. srednia = (
  3. SELECT avg(srednia) FROM srednie sr WHERE sr.id >= srednie.id )

Nie jestem pewien, czy to zadziała (szczerze mówiąc - mam wątpliwości, czy da to, co byś chciał), ale możesz z tym pokombinować.

W między czasie wyszlo mi jeszcze coś takiego. Nie do konca to jest jeszcze to, ale nie moge dalej popracowac nad tym zapytaniem, bo mój pg się chyba właśnie wysypał.

Może Ci to jednak pomoże?
  1. SELECT srednie.id,
  2. srednie.liczba,
  3. ( SELECT AVG( sr.liczba )
  4. FROM srednie sr
  5. WHERE sr.id IN ( SELECT sr2.id
  6. FROM srednie sr2
  7. WHERE sr2.id <= srednie.id
  8. ORDER BY sr.id DESC LIMIT 4
  9. )
  10. )
  11. FROM srednie GROUP BY id,liczba
  12. ORDER BY id
  13. ;
Blackhole
Wreszcie ktoś odpowiedział smile.gif

DeyV, ciut zmieniłem Twój kod (ten dłuższy) i zadziałało winksmiley.jpg biggrin.gif SELECT wypisuje to, co chciałem!
Wielkie dzięki!!!!! Rkingsmiley.png
DeyV
A może byś pokazał to pytanie? winksmiley.jpg
Blackhole
A więc tablica nazywa się tbl i jest taka:
Kod
data  | num | śr_kr_4
------+-----+---------
A mój kod to:
  1. SELECT tbl.DATA, tbl.num,
  2. ( SELECT AVG(sr.num)
  3. FROM tbl sr
  4. WHERE sr.DATA IN ( SELECT sr2.DATA
  5. FROM tbl sr2
  6. WHERE sr2.DATA <= tbl.DATA
  7. ORDER BY sr2.DATA DESC LIMIT 4
  8. )
  9. ) AS "śr_kr_4"
  10. FROM tbl GROUP BY tbl.DATA, tbl.num
  11. ORDER BY DATA;
Dostosowałem to jedynie do nazw kolumn i ich typów w mojej tablicy i dodałem "tbl." w grupowaniu w głównym zapytaniu (choć nie chciało mi się sprawdzać, czy bez tego też by działało).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.