Wednesday 30 August 2017

Laskea Liikkuvan Keskiarvon In Sql Palvelin


Työskentelen SQL Server 2008 R2: n kanssa, joka yrittää laskea liikkuvaa keskiarvoa. Mielestäni jokaisen tietueen osalta haluan kerätä 250 aiemman tietueen arvot ja laskea tämän valinnan keskiarvo. Omat näkymän sarakkeet ovat seuraavat: TransactionID on ainutlaatuinen. Kullekin TransactionID: lle. Haluan laskea sarakkeen keskiarvon edellisistä 250 tallenteesta. Joten TransactionID 300: lle kerää kaikki arvot aiemmista 250 riveistä (näkymä lajitellaan laskemalla TransactionID: n mukaan) ja sitten sarakkeessa MovAvg kirjoitetaan näiden arvojen keskiarvo. Aion kerätä tietoja useista tietueista. kysyi 28. lokakuuta 14 klo 20: 58Exponentiaalinen liukuva keskiarvo T-SQL: ssä Eksponentiaaliset liukuvat keskiarvot ovat samankaltaisia ​​kuin painotetut liukuva keskiarvot, koska ne antavat vähemmän painoa muutoksille jo kauan sitten ja painoarvoa viimeaikaisiin muutoksiin. Painotetut liukuvat keskiarvot ovat lineaarisia, mutta eksponentiaaliset liikkuvat keskiarvot ovat eksponentiaalisia. Eli paino voidaan ilmaista käyränä: On olemassa hieno tapa laskea eksponentiaalisia liikkuvia keskiarvoja T-SQL: ssä käyttämällä epäolennaista ominaisuutta SQL Serverin muuttujien ja juoksevien kokonaismäärien suhteen. Tässä blogikirjoituksessa esitän kuinka käytän tätä menetelmää eksponentiaalisen liukuvan keskiarvon laskemiseksi T-SQL: ssä, mutta esittelen myös menetelmän, joka käyttää standardin ominaisuuksia SQL Serverissa. Valitettavasti tämä merkitsee silmukan käyttämistä. Esimerkeissä lasken 9 päivän eksponentiaalinen liukuva keskiarvo. Esimerkit käyttävät TAdb-tietokantaa. Käsikirjoitus luoda TAdb löytyy täältä. Eksponentiaalinen liikkuva keskiarvo (EMA): Running Totals - menetelmä Jeff Moden kuvailee yksityiskohtaisesti ajantasaisten päivitysten ominaisuuksien teoriaa artikkelissa Ratkaiseminen Running Total ja Ordinal Rank Problems. Muut resurssit, jotka kuvaavat tätä menetelmää EMA: n laskemiseksi, ovat Gabriel Priesterin ja Foorumikeskuksen Exponential Moving Average Challenge - tietokannan laskemalla T-SQL: n liikuttavat keskiarvot. sekä SQL Server Centralissa. Periaatteessa T-SQL: ssä voit päivittää muuttujia sekä sarakkeita päivityslausumassa. Päivitykset tehdään rivi riviltä sisäisesti SQL Server. Tämä rivi rivinvaihtelu on se, mikä tekee laskemalla käynnissä olevan kokonaismäärän. Tämä esimerkki näyttää, miten se toimii: Huomaa, että 8220ColumnRunningTotal8221 on käynnissä 8220ColumnToSum8221. Tämän menetelmän avulla voimme laskea EMA9: n tällä T-SQL: llä: EMA: n laskeminen on melko yksinkertaista. Käytämme nykyistä riviä ja edellistä, mutta enemmän painoa nykyiseen riviin. Paino lasketaan kaavalla 2 (19), jossa 822098221 on EMA: n pituuden parametri. EMA9: n laskemiseksi yllä olevan rivin 10 osalta laskelma on: Tässä tapauksessa nykyinen rivi saa 20 painosta (2 (19) 0,2) ja edellinen rivi saa 80 painosta (1-2 (19) 0,8). Löydät tämän laskelman yllä olevassa lausunnossa CASE-selvityksessä: Exponential Moving Average (EMA): Looping Method No niin kuin minä tiedän, lukuun ottamatta yllä mainittuja käynnissä olevia kokonaismenetelmiä, ei ole mitään keinoa laskea EMA: ta käyttäen perustettua SQL-lausetta . Sen vuoksi alla oleva T-SQL käyttää laskentayksikköä EMA9: n laskemiseen: Tulokset ovat samat kuin yllä olevassa esimerkissä. Suorituskyky Kuten odotettiin, set-based running totals - versio on nopeampi kuin loop-versio. Laitteessani set-pohjainen ratkaisu oli noin 300 ms, verrattuna noin 1200 silmukkamuotoiseen versioon. Silmukkamuoto on kuitenkin SQL-standardien mukainen. Joten vaihtoehtojen valinta riippuu siitä, mitä tärkein sinulle, suorituskyvylle tai standardeille. Eksponentiaalinen liukuva keskiarvo voidaan käyttää trendianalyysissä, kuten muiden liikkuvien keskiarvojen, Simple Moving Average (SMA) ja painotetun liikkuvan keskiarvon (WMA) kanssa. On myös muita laskelmia teknisessä analyysissä, joka käyttää EMA: ta, MACD: tä. Tämä blogikirjoitus on osa sarjaa teknisestä analyysistä, TA, SQL Serverista. Katso muut viestit täältä. Lähettäjä Tomas Lind Tomas Lind - Konsultointipalvelut SQL Server DBA: n ja tietokannan kehittäjänä High Coast Database Solutions AB: ssä. Aiemmin keskustelimme siitä, miten kirjoitamme Rolling Average - ratkaisut Postgres - yhtiössä. Suositusta kysynnästä kerrottiin, miten tehdä sama MySQL: ssä ja SQL Serverissa. Hyvin kattavat, miten merkitä tämänkaltaiset meluisat kaaviot: 7 päivän edeltävän keskilinjalla: Big Idea Ensimmäinen kaavio yllä on melko meluisa ja vaikea saada hyödyllistä tietoa. Voimme tasoittaa sen tekemällä 7 päivän keskiarvon taustalla olevien tietojen päälle. Tämä voidaan tehdä ikkunatoiminnoilla, itsenäistyksillä tai korreloiduilla alikyselyillä - hyvin kattaa kaksi ensimmäistä. Aloita edellisellä keskiarvolla, mikä tarkoittaa sitä, että kuukauden 7. päivä keskimääräinen piste on ensimmäisen seitsemän päivän keskiarvo. Visuaalisesti tämä siirtää piikit kaaviossa oikealle, kun ison piikki on keskiarvo seuraavien seitsemän päivän aikana. Ensinnäkin Luo keskitason taulukko Haluamme laskea keskimäärin jokaisen päivämäärän perusteella. Olettaen, että meillä on tyypillinen käyttäjätasku, jossa on rivi uudelle käyttäjälle ja luotiin aikaleima, voimme luoda yhteenvetomme kirjautumissämme taulukon seuraavasti: Postgresissä ja SQL Serverissa voit käyttää tätä CTE: nä. MySQL: ssä voit tallentaa sen väliaikaiseksi taulukoksi. Postgres Rolling Average Onneksi Postgresillä on ikkunafunktioita, jotka ovat yksinkertaisin tapa laskea juoksevan keskiarvon. Tämä kysely edellyttää, että päivämäärillä ei ole aukkoja. Kysely on keskimäärin viimeisten seitsemän riviä, ei viimeisiä seitsemää päivämäärää. Jos tietosi ovat aukkoja, täytä ne generateseries tai liittymällä taulukon kanssa tiheä päivämäärä rivejä. MySQL Rolling Average MySQL puuttuu ikkunafunktioista, mutta voimme tehdä samanlaisen laskennan käyttämällä itsenäisiä liittymiä. Jokaisen kriteerin taulukon riville liitymme kaikkiin riveihin, jotka ovat olleet viimeisten seitsemän päivän aikana ja ottavat keskimäärin. Tämä kysely käsittelee päivämääräerot automaattisesti, kun tarkastelemme rivejä aika-alueella, eikä edeltäviä N-rivejä. SQL Server Rolling Average - ohjelmistolla SQL Serverilla on ikkunafunktioita, joten laskevan keskiarvon laskeminen voidaan tehdä joko Postgres-tyyliin tai MySQL-tyyliin. Yksinkertaisuuden vuoksi käytettiin MySQL-versiota itsenäisen liittymän avulla. Tämä on käsitteellisesti sama kuin MySQL: ssä. Ainoat käännökset ovat dateadd-toiminto ja nimenomaisesti nimetty ryhmä sarakkeittain. Muut keskiarvot Keskityimme tämän postin 7 päivän jälkeiseen keskiarvoon. Jos halusimme tarkastella 7 päivän johtavaa keskiarvoa, niin se on yhtä helppoa kuin päivämäärät lajittelemaan toiseen suuntaan. Jos halusimme tarkastella keskitettyä keskiarvoa, käytä: Postgres: rivit 3 edeltävän ja 3 seuraavan MySql: n välillä: signups. date - 3 ja signups. date 3 välillä MySQL SQL Server: päivämäärän (päivä, -3, kirjautumiset) välillä. päivämäärä) ja dateadd (päivä, 3, signups. date) Im ole täysin tuttuja SQL vielä: vastasin liian nopeasti anteeksi. Yritin muuttaa koodia lisäämällä uuden liikuttavan keskiarvon, mutta epäonnistui, voisitko katsoa sitä ja kertoa minulle, mitä puuttuu MA AS: llä (SELECT ma. TradeDate, ma. Opening, ROWNUMBER () OVER (ORDER BY TradeDate ) AS Order FROM EurostoxxBase1 ma) VALITSE ma. TradeDate, ma. Opening, ma2.Opening, ma3.Opening, ((ma. Opening 43 ma2.Opening) 2) AS MovingAverage2, ((ma. Opening 43 ma2.Opening 43 ma3 3) AS MovingAverage3, ((ma. Opening 43 ma2.Opening 43 ma3.Opening) 43 ma4.Opening) 4) AS MovingAverage4 MA MA VASTA ULKOINEN YHTEISTYÖ MA ma2 ON ma. Order ma2.Order 43 1 LEFT OUTER LIITY MA ma3 ON ma2.Order ma3.Order 43 1 LEFT OUTER JOIN MA ma4 ON ma3.Order ma4.Order 43 1 Kun käsittelen käsikirjoitusta luodaan tilapäinen taulukko, haluan lisätä nämä uudet sarakkeet (MovingAverage1 MovingAverage2 .) taulukkoon. Kuinka voin lisätä nämä liukuvat keskiarvot pöytäänni Tiistai 27.4.2010 11:33 AM Mitä sinulla on 4 päivän liukuva keskiarvo näyttää hyvältä, paitsi jos sinulla on ylimääräinen vasen sulu, kun quot43 ma3.Opening) 43 Ota yksi ma3.Opening. Jos haluat liittää liikkuvia keskiarvoja peruspöydässä, laukaisut on otettava mukaan, jollei jollakulla ole muuta ajatusta - muuta kuin voit luoda näkymän, joka sisältää lausekkeen ja käyttää näkymää peruspöydän sijaan. Tiistai, huhtikuu 27, 2010 1:29 PM Voisitko kertoa minulle lisää miten käyttää laukaista tässä tapauksessa. Minulla on oltava eri liikkuvat keskiarvot taulukossani, minun täytyy tehdä laskelmia. Minun täytyy lisätä nämä liukuvat keskiarvot omaan pöytään. Tiistai, huhtikuu 27, 2010 14:14 Triggers lisäävät suurta määrää yleiskustannuksia. Jos esimerkiksi säilytät peruspöydässä 4 vuorokautta liikkuvia keskiarvoja, kun artikkeli on lisätty tai päivitetty, päivitysohjeet tapahtuvat ja enintään 4 lisäpäivitystä tuotteesta, joten yhteensä 5 yksittäistä päivitystä varten. Muutamille kohteille sinulla on paljon kiistelyä, mutta jos oli useita insertsupdates toinen minuutti, tämä voi johtaa monia kysymyksiä mukana lukkiutumisen. En suosittele laskennallisten arvojen pitämistä peruspöyissä, niitä pitäisi pitää näkemyksissä tai analyysipalvelujen avulla. Muutan sovelluksen arkkitehtuuria ennen kuin muut ongelmat siirtyvät sisään ja aiheuttavat tuhoa myöhemmin. Kuitenkin voit lukea Triggers täältä. Tiistai 27.4.2010 14:32 Tallennettu arvo ei muutu mistään syystä. Ne ovat historiallisia tietoja. Liikkuvat keskiarvot eivät muutu. Mielestäni on luoda toinen taulukko (ei väliaikaista) ja sitten liittyä Oma alkupisteeni historiallisiin tietoihin ja taulukkoon, jossa on lasketut liikkuvat keskiarvot. Kaikki nämä tiedot ovat kiinteitä, päivityksiä ei ole, ei lisäyksiä, ei poistettuja. Ainoa asia, jonka voin kuvitella on, kun minun on lisättävä lisää tietoja, esimerkiksi minun on lisättävä huhtikuussa 2010 toukokuun ensimmäisinä päivinä, en halua uudestaan ​​koko prosessia, vaan lisää vain kyseiseen arvoja ja uskon, että voin käsitellä sitä. Mitä mieltä olette, olenko täysin väärässä liittymässä näihin 2 pöytään Tiistai, 27.4.2010 14:46 Mutta minusta tuntuu, että on olemassa ongelma luodun taulukon kanssa: CREATE TABLE MovingAverage (TradeDateAvg SMALLdatetime, OpeningAvg FLOAT, B1MAvg2 FLOAT, B1MAvg3 FLOAT, B1MAvg4 FLOAT WITH MA AS (VALITSE ma. TradeDate, ma. Opening, ROWNUMBER () OVER (ORDER BY TradeDate) AS Tilaus EurostoxxBase1 ma) VALITSE 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 MA MA LEFT OUTER YHTEISTYÖ MA ma2 ON ma. Order ma2. Tilaus 43 1 LEFT OUTER JOIN MA ma3 ON ma2.Order ma3.Order 43 1 LEFT OUTER JOIN MA ma4 ON ma3.Order ma4.Order Se toimii täydellisesti, näen kaikki arvot. Mutta taulukko on tyhjä, tarkoitan, kun ajetaan. valitse MovingAverageista Se antaa minulle vain sarakkeiden nimet, ei lainkaan arvoa Mikä tahansa vääriin ajatus Kiitos paljon, muutin koodini: CREATE TABLE MovingAverage (TradeDateAvg SMALLdat (TradeDate) AS Order FROM EurostoxxBase1 ma) INSERT INTO MovingAverage (TradeDateAvg, OpeningAvg, B1MAvg2, FLOAT, B1MAvg3 FLOAT, B1MAvg2 , B1MAvg3, B1MAvg4) VALITSE 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 MA MA VASTA ULKOINEN JOIN MA ma ON ON ma. Order ma2.Order 43 1 LEFT OUTER JOIN MA ma3 ON ma2.Order ma3.Order 43 1 VASEN ULKOINEN YHTEISTYÖ MA MA4 ON ma3.Order ma4.Order 43 1 Mutta mitään ei tapahdu Pyyntö on edelleen käynnissä, ei virhesanomaa, mutta näyttää siltä, ​​ettei se luo mitään. Minulla on idea, mitä kaipaan uudestaan

No comments:

Post a Comment