![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 20 Pomógł: 1 Dołączył: 25.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Mam dylemat, jak realizować pewne funkcje statystyczne. Przykładowo codziennie scrapuje sobie kurs waluty. Zapisuje sobie w bazie wg formatu: data | kurs_dnia.
Pytanie, czy np. aby opracować sobie np. średnią przyrostu/spadku z np. 100 pozycji, musiałoby to oznaczać robienie w locie obliczania z surowych danych tego przy każdym wywołaniu witryny. Czy zatem nie lepiej sobie przy zaciąganiu danych od razu powyliczać niektóre dane? Mam też podobny dylemat jeśli chodzi np. o obliczanie przyrostów dla poszczególnych dni, wtedy ilość operacji była by jeszcze większa - bo dla każdej daty trzeba by było sprawdzić jaki to dzień tygodnia, wyciągnąć wartości osobno dla pon, wt, śr... itd, i dopiero tu zrobić średnią wg dni tygodnia. -------------------- WebSEM.pl - Jak promować stronę internetową? - marketing internetowy i nie tylko...
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 186 Pomógł: 18 Dołączył: 2.09.2010 Ostrzeżenie: (0%) ![]() ![]() |
Pytasz o to czy od razu pobierać średnią z bazy czy liczyć ją dopiero w php?
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 20 Pomógł: 1 Dołączył: 25.01.2009 Ostrzeżenie: (0%) ![]() ![]() |
Nie. To rozumiem, że jest wygodniejsze w zapytaniu. Chodzi mi o sytuację gdy:
2014-02-19 | 321 2014-02-20 | 322 2004-02-21 | 330 I, chce pokazać użytkownikom wzrost pomiędzy wartościami. Mogę to obliczać żywcem biorąc z bazy i lecąc za każdym wywołaniem php wartość(dziś) - wartość (dziś-1), druga opcja to zapisanie tego w taki sposób, żeby przyrost był od razu zapisywany: 2014-02-19 | 321 | - 2014-02-20 | 322 | 1 2004-02-21 | 330 | 8 Taki sam dylemat mam odnośnie kwestii statystycznej, np. chcąc zrobić porównanie wzrostów wg dni tygodnia. Czy lepiej w przelocie sprawdzać jaki dzień tygodnia wynika z daty, czy w nowej kolumnie DB zapisać dzień tygodnia jako 1-7. Ułatwia to selekcję danych potem, stosując WHERE, bez tego niestety za każdym razem musiałbym to ustalać php'em. Ten post edytował jsmp 21.02.2014, 10:39:58 -------------------- WebSEM.pl - Jak promować stronę internetową? - marketing internetowy i nie tylko...
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
1. Jeżeli dane masz zapisywane dzień po dniu bez luk w dniach to możesz pozostać przy strukturze data, wartość. Wystarczy wówczas, że dołączysz (LEFT JOIN - LEFT by uwzględnić też pierwszy wynik) jeszcze raz tą samą tabelę (pamiętając o aliasie) na warunku (ON) poprzedni.data = biezacy.data - 1 dzien. No i zwykłym odejmowaniem obliczysz różnicę (pamiętając o COALESCE(poprzedni.wartosc, 0) żeby uniknąć NULLi). Jeśli natomiast mogą być luki w datach to nie możesz zrobić opisanego JOINa, bo zapewne chciałbyś uzyskać dane dla dnia poprzedniego zapisanego w bazie (czyli jeśli nie ma danych za wczoraj, to weź z przedwczoraj). Chyba, że miałyby Cię interesować tylko dni poprzednie - wówczas możesz zostać przy JOINie.
2. Dzień tygodnia możesz wyczaić w samym SQL: http://dev.mysql.com/doc/refman/5.5/en/dat...ction_dayofweek |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 186 Pomógł: 18 Dołączył: 2.09.2010 Ostrzeżenie: (0%) ![]() ![]() |
Wydaje mi się że jeżeli chcesz to tylko do warstwy prezentacji (tylko do wyświetlania sekwencji) np do pokazania wykresu to przetrzymywanie tej wartości w bazie nie ma sensu. Natomiast jeżeli chcesz w miarę szybko wyszukiwać po tej wartości np. odszukać wszystkie dni gdzie był spadek/wzrost to może warto byłoby to trzymać. ale osobiście zrobiłbym do tego jakąś osobną tabelę żeby nie zaciemniać sobie obrazu właściwych danych. Dodatkowo musisz pamiętać, że dane z dodatkowej tablicy przestaną być aktualne jeżeli zmienisz coś we właściwych danych. Wtedy należy pamiętać o dwóch update'ach
![]() -- edit Myślę, że mógłbyś jeszcze utworzyć dodatkową kolumnę z identyfikatorem dnia poprzedniego np: Kod id_dzien, wartosc, id_dzien_poprzedni 1 10 NULL 2 13 1 3 5 2 id_dzien_poprzedni dać jako klucz obcy (id_dzien) i wtedy możesz sobie łączyć dane zwykłym joinem, liczyć średnie, wyszukiwać dni ze zyskiem/stratą Ten post edytował ghost1511 21.02.2014, 11:31:51 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Po co ta dodatkowa kolumna? Przecież to wszystko można w SQL policzyć. Fakt, jeśli mogą być luki i istnieje nas poprzedni wpis (niekoniecznie poprzedni dzień) wówczas na pewno przyspieszy to zapytanie zasugerowane przeze mnie. Logiczniejsze dla mnie jednak jest bazowanie na dniu poprzednim, a nie poprzedniej wartości.
PS: Żeby móc JOINować wcale nie trzeba zakładać klucza obcego. W tym przypadku należałoby go jednak założyć, ale z racji integralności danych, a nie możliwości/niemożliwości wykonywania złączeń. |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 186 Pomógł: 18 Dołączył: 2.09.2010 Ostrzeżenie: (0%) ![]() ![]() |
Tak tak
![]() |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Ja bym zadbał o to by mieć dane na każdy dzień i zrobił to tak:
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.06.2025 - 11:16 |