Thursday 21 December 2017

Calculate moving average in sql server


Pracuję z SQL Server 2008 R2, próbując obliczyć średnią ruchoma. Dla każdego rekordu w moim widoku chciałbym zebrać wartości z 250 poprzednich rekordów, a następnie obliczyć średnią dla tego wyboru. Moje kolumny widoku są następujące: TransactionID jest unikatowy. Dla każdego identyfikatora transakcji. Chciałbym obliczyć średnią dla wartości kolumny, w ciągu ostatnich 250 rekordów. Więc w przypadku TransactionID 300 zbierz wszystkie wartości z poprzednich 250 wierszy (widok jest sortowany malejąco według TransactionID), a następnie w kolumnie MovAvg zapisać wynik średniej z tych wartości. Szukam gromadzić dane w wielu rejestrach. Zapytany 28 października o godzinie 20: 58Expenential moving average w T-SQL Exponential moving average jest podobny do ważonych średnich kroczących, ponieważ przypisują mniej wagi do zmian dawno temu i większą wagę do ostatnich zmian. Średnie ważone ruchomości są liniowe, ale średnie ruchy wykładnicze są wykładnicze. Oznacza to, że masa może być wyrażona jako krzywa: Jest świetny sposób obliczenia średnich ruchów wykładniczych w T-SQL przy użyciu nieudokumentowanej funkcji dotyczącej zmiennych i sum działających w programie SQL Server. W tym blogu pokażę, jak posłużyć się tą metodą do obliczania wykładniczej średniej ruchomej w T-SQL, ale przedstawię również metodę używającą standardowych funkcji w programie SQL Server. Niestety oznacza to użycie pętli. W przykładach obliczę 9-dniową średnią ruchową wykładniczą. Przykłady używają bazy danych TAdb. Skrypt do tworzenia TAdb można znaleźć tutaj. Średnia przemieszczeniowa (EMA): Uruchamianie metod sumy Teoria funkcjonowania ogólnych funkcji w aktualizacjach została opisana szczegółowo przez Jeffa Modena w artykule Rozwiązanie problemów związanych z biegiem całkowitym i porządkowym. Inne zasoby, które opisują przy użyciu tej metody do obliczania EMA to blog post Obliczanie średnich kroczących przy użyciu T-SQL przez Gabriel Priestera i poświęcony dyskusji na forum poświęcony średnim wyzwaniom. zarówno w programie SQL Server Central. Zasadniczo w T-SQL można aktualizować zmienne, jak również kolumny w instrukcji aktualizacji. Aktualizacje są wykonywane wiersz po wierszu wewnętrznie przez SQL Server. To zachowanie wiersz po wierszu umożliwia obliczanie całkowitej liczby możliwych do wykonania. Ten przykład pokazuje, jak to działa: Zauważ, że 8220ColumnRunningTotal8221 to uruchomiona łączna liczba 8220ColumnToSum8221. Przy użyciu tej metody możemy obliczyć EMA9 z tym T-SQL: Obliczanie EMA jest dość proste. Używamy bieżącego wiersza i poprzedniego, ale z większą wagą do bieżącego wiersza. Waga oblicza się według wzoru 2 (19), gdzie 822098221 jest parametrem długości EMA. Aby obliczyć wartość EMA9 dla wiersza 10 powyżej, obliczenia są następujące: w tym przypadku bieżący wiersz ma 20 wadze (2 (19) 0,2), a poprzedni wiersz ma 80 waga (1-2 (19) 0,8). Obliczenie to znajduje się w powyższym oświadczeniu w instrukcji CASE: Średnia przemieszczeniowa (EMA): metoda pętli Poniższa metoda pozwala na obliczanie EMA przy użyciu zestawu instrukcji SQL . Dlatego poniższy SQL w T-SQL używa pętli while do obliczenia EMA9: Wyniki są takie same jak w sumie bieżącego przykładu powyżej. Wydajność Zgodnie z oczekiwaniami ustawiona wersja uruchamiania sumy jest szybsza niż wersja pętli. Na moim komputerze rozwiązanie oparte na zestawie wynosiło około 300 ms, w porównaniu do około 1200 z wersją pętli. Wersja pętli jest jednak bardziej zgodna ze standardami SQL. Wybór pomiędzy tymi metodami zależy od tego, co najbardziej dla Ciebie najważniejsze, wydajności lub standardów. Średnia średnica ruchoma może być użyta w analizie trendów, podobnie jak w przypadku innych typów średnich kroczących, Simple Moving Average (SMA) i Ważona średnia ruchoma (WMA). Istnieją również inne obliczenia w technicznej analizie, na przykład wykorzystujące EMA, na przykład MACD. Ten wpis na blogu jest częścią serii o technicznej analizie, TA, w programie SQL Server. Zobacz inne posty tutaj. Wysłane przez Tomas Lind Tomas Lind - Usługi konsultingowe jako SQL Server DBA i Database Developer w firmie High Coast Database Solutions AB. Oczywiście omówiliśmy, jak pisać średnie kroczące w Postgresie. Poprzez popularne zapotrzebowanie pokazano, jak to zrobić w MySQL i SQL Server. Dobrze pokrywamy opisowanie hałaśliwych wykresów: 7-dniowa poprzednia średnia linia: Wielka idea Nasz pierwszy wykres powyżej jest dość hałaśliwy i trudny do uzyskania przydatnych informacji. Możemy to wygładzić, spisując średnią na 7 dni na podstawie danych bazowych. Można to zrobić z funkcjami okien, samonastawów lub skorelowanymi podukwerami - dobrze zakryj pierwsze dwa. Zacznijmy od poprzedniej średniej, co oznacza, że ​​średnia punkt 7 dnia miesiąca jest średnią z pierwszych siedmiu dni. Wizualnie przesuwa kolczyki na wykresie po prawej stronie, ponieważ w ciągu następnych siedmiu dni średnia ułamka jest uśredniona. Po pierwsze, utworzyć tabelę średniej liczby głosów Chcemy obliczyć średnią w stosunku do wszystkich rejestracji dla każdego dnia. Zakładając, że mamy typową tabelę użytkowników z wierszem dla każdego nowego użytkownika i utworzony timestamp, możemy utworzyć naszą zbiorczą tabelę rejestracji tak: W Postgresie i SQL Server możesz użyć tego jako CTE. W MySQL można zapisać ją jako tymczasową tabelę. Postgres Rolling Average Na szczęście Postgres ma funkcje okienkowe, które są najprostszym sposobem obliczania średniej bieżącej. To zapytanie zakłada, że ​​daty nie mają luk. Zapytanie jest uśrednione w ciągu ostatnich siedmiu wierszy, a nie w ciągu ostatnich siedmiu dni. Jeśli Twoje dane zawierają luki, wypełnij je generacjami lub łącz się ze stołem o gęstych wierszach daty. MySQL Rolling Average MySQL brakuje funkcji okienkowych, ale możemy wykonać podobne obliczenia przy użyciu samozapłonów. Dla każdego wiersza w tabeli zliczania dołączamy do każdego wiersza w ciągu ostatnich siedmiu dni i średniej. To zapytanie automatycznie obsługuje luki w dłuższej iloś ci, gdyż szukamy wierszy w zakresie dat, a nie w poprzednich n wierszach. SQL Server Rolling Average SQL Server ma funkcje okienkowe, więc obliczanie średniej kroczki można wykonać w stylu Postgres lub stylu MySQL. Dla uproszczenia używaliśmy wersji MySQL z własnym połączeniem. Jest to pojęciowo takie samo jak w MySQL. Jedyne tłumaczenia to funkcja dateadd i wyraźnie nazwana grupą według kolumn. Pozostałe średnie Skupiamy się na 7-dniowej średniej końcowej w tym poście. Gdybyśmy chcieli przyjrzeć się 7-dniowej średniej, to tak proste, jak sortowanie dat w innym kierunku. Jeśli chciałbyś spojrzeć na średnią, użyj wed: Postgres: wiersze między 3 poprzedzające i 3 następujące po stronie MySql: między signups. date - 3 i signups. date 3 w MySQL SQL Server: między dateadd (day, -3, signups. data) i dateadd (dzień, 3, signups. date) Im nie do końca zaznajomiony z SQL: odpowiedziałem zbyt szybko przepraszam. Próbowałem zmienić swój kod, aby dodać nową średnią doboru, ale nie udało się, mógłbyś na nią spojrzeć i powiedz mi, co brakuje Z MA AS (SELECT ma. TradeDate, ma. Opening, ROWNUMBER () OVER (ORDER BY TradeDate ) AS Zlecenie od EurostoxxBase1 ma) SELECT ma. TradeDate, ma. Opening, ma2.Opening, ma3.Opening, ((ma. Opening 43 ma2.Opening) 2) AS MovingAverage2, ((ma. Opening 43 ma2.Opening 43 ma3.Opening) 3) AS MovingAverage3, ((ma. Opening 43 ma2.Opening 43 ma3.Opening) 43 ma4.Opening) 4) AS MovingAverage4 OD MA ma LEFT ZEWNĘTRZNE MAIN MA2 NA ma. Order ma2.Order 43 1 LEFT OUTER JOIN MA ma3 ON ma2.Order ma3.Order 43 1 LEFT OUTER JOIN MA MA4 NA ma3.Order ma4.Order 43 1 Kiedy uruchomię skrypt, tworzy tymczasową tabelę, co chciałbym dodać do tych nowych kolumn (MovingAverage1 MovingAverage2 . ) na stół. Jak mogę dodać te średnie ruchy do mojego stołu wtorek, 27 kwietnia 2017 11:33 Co masz na 4-dniową średnią ruchliwą wygląda dobrze, z wyjątkiem dodatkowego lewego nawiasu po 43-ma3.Opening) 43 Wyjąć jeden po ma3.Opening. Aby średnie kroki w tabeli podstawowej były aktywne, wyzwalacze będą musiały być zaangażowane, chyba że ktoś inny ma inny pomysł - poza tym możesz utworzyć widok, aby ukryć instrukcję select, a następnie użyć widoku zamiast tabeli podstawowej. Wtorek, 27 kwietnia 2017 01:29 Czy możesz powiedzieć mi więcej o tym, jak używać wyzwalacza w tym przypadku. Muszę mieć różne średnie ruchome w moim stole, ja muszę zrobić jakieś obliczenia. Muszę dodać te średnie ruchome do mojego stołu. Wtorek, 27 kwietnia 2017 2:14 Kierowcy dodają w dużej ilości narzutów. Na przykład, jeśli miałbyś trzymać 4 dni średnie kroku w tabeli podstawowej, gdy element został włożony lub zaktualizowany, wystąpi insertupdate, a następnie do 4 kolejnych aktualizacji dla każdego elementu, więc łącznie 5 dla pojedynczego insertupdate. W przypadku kilku rzeczy nie ma się wiele do powiedzenia, jednak jeśli było wiele insertsupdates na drugą minutę, może to doprowadzić do wielu problemów włącznie z blokadą. Nie radzę utrzymywać wartości obliczonych w tabelach podstawowych, powinny być przechowywane w widokach lub przy użyciu usług analizy. Chciałbym zmienić architekturę aplikacji, zanim inne problemy zaczną się pełzać i powodować spustoszenie później. Możesz jednak przeczytać o wyzwalaczach TUTAJ. Wtorek, 27 kwietnia 2017 2:32 PM Zapamiętana wartość nie ulegnie zmianie z jakiegokolwiek powodu. Są to dane historyczne. Ruchome średnie nic nie zmienia. Chodzi mi o to, aby spakować drugi stół (nie tymczasowy), a następnie dołączyć do Mojej tabeli początkowej z danymi historycznymi i tabelą z obliczonymi średnimi Moving. Wszystkie te dane są poprawne, nie ma aktualizacji, żadnej wstawki, ani usunięcia. Jedyny problem, jaki wyobrażam sobie, to kiedy muszę dodać więcej danych, na przykład będę musiała dodać kwietnia 2017 r. W pierwszych dniach maja, nie chcę ponownie uruchomić całego procesu, ale dodać tylko dla konkretnych wartości i myślę, że mogę to zrobić. Co myślisz, Czy całkowicie się mylę łącząc te dwa tabele wtorek, 27 kwietnia 2017 2:46 PM Ale brzmi to, że wystąpił problem z stołem utworzonym: CREATE TABLE MovingAverage (TradeDateAvg SMALLdatetime, OpenAvg FLOAT, B1MAvg2 FLOAT, B1MAvg3 Płyta FLOAT, Płyta B1MAvg4 z MA AS (SELECT ma. TradeDate, ma. Opening, ROWNUMBER () OVER (ORDER BY TradeDate) AS Zlecenie od EurostoxxBase1 ma) SELECT ma. TradeDate, ma. Opening, ma2.Opening, ma3.Opening, ma4.Opening, ((ma. Opening 43 ma2.Opening) 2) AS B1MAvg2, ((ma. Opening 43 ma2.Opening 43 ma3.Opening) 3) AS B1MAvg3 Z MA MA LEFT ZEWNĘTRZNE ZNAJOMIE MA ma2 NA ma. Oder ma2. Zlecenie 43 1 LEFT OUTER JOIN MA ma3 ON ma2.Order ma3.Order 43 1 LEFT OUTER JOIN MA MA4 ON ma3.Order ma4.Order Działa doskonale, widzę wszystkie wartości Ale stół jest pusty, mam na myśli, kiedy biegam. wybierz z MovingAverage Daje mi tylko nazwy kolumn, nie ma żadnej wartości Jakikolwiek pomysł, co zrobiłem źle Dziękuję bardzo, zmodyfikowałem mój kod: CREATE TABLE MovingAverage (TradeDateAvg SMALLdat etime, OpenAvg FLOAT, Płyta FLASH B1MAvg2, Płyta B1MAvg3, Płyta B1MAvg4 z MA AS (SELECT ma. TradeDate, ma. Opening, ROWNUMBER () OVER (ORDER BY TradeDate) AS Zlecenie od EurostoxxBase1 ma) INSERT INTO MovingAverage (TradeDateAvg, OpeningAvg, B1MAvg2 , B1MAvg3, B1MAvg4) SELECT ma. TradeDate, ma. Opening, ((ma. Opening 43 ma2.Opening) 2) AS B1MAvg2, ((ma. Opening 43 ma2.Opening 43 ma3.Opening) 3) AS B1MAvg3, (( ma. Opening 43 ma2.Opening 43 ma3.Opening 43 ma4.Opening) 4) AS B1Mavg4 OD MA MAŁO ZEWNĘTRZNE ZNAJOMIE MA ma2 NA ma. Order ma2.Order 43 1 LEFT OUTER JOIN MA ma3 ON ma2.Order ma3.Order 43 1 LEFT OUTER JOIN MA ma4 ON ma3.Order ma4.Order 43 1 Ale nic się nie stało Wniosek jest wciąż w toku, nie ma komunikatu o błędzie, ale wydaje się, że nic nie tworzy. Każdy pomysł, o czym tęsknię

No comments:

Post a Comment