Bewegende gemiddelde in T-SQL n gemeenskaplike berekening tendens analise is die bewegende (of rollende) gemiddelde. 'N bewegende gemiddelde is die gemiddeld van die byvoorbeeld laaste 10 rye. Die bewegende gemiddelde wys 'n meer gladde kurwe as die werklike waardes, meer so met 'n langer tydperk vir die bewegende gemiddelde, maak dit 'n goeie hulpmiddel vir tendens analise. Hierdie blog post sal wys hoe om te bereken bewegende gemiddelde in T-SQL. Verskillende metodes sal gebruik word, afhangende van die weergawe van SQL Server. Die onderstaande grafiek toon die smoothing effek (rooi lyn) met 'n 200 dae bewegende gemiddelde. Die voorraadkwotasies is die blou lyn. Die langtermyn tendens is duidelik sigbaar. T-SQL Moving Avergage 200 dae onderstaande demonstrasie vereis die TAdb databasis wat geskep kan word met die script hier geleë. In die komende voorbeeld sal ons 'n bewegende gemiddelde te bereken vir die afgelope 20 dae. Afhangende van die weergawe van SQL Server, sal daar 'n ander metode om die berekening te doen. En, soos ons later sal sien, die nuwer weergawes van SQL Server het funksies in staat stel 'n baie meer doeltreffende berekening. SQL Server 2012 en later Moving Gemiddelde Hierdie weergawe maak gebruik van 'n totaal venster funksie. Wat is nuut in SQL 2012 is die moontlikheid om die grootte van die venster beperk deur hoeveel rye voor die venster moet bevat: Rye voorafgaande is 19, want ons het die huidige ry sowel in die berekening in te sluit. Soos jy kan sien, die berekening van bewegende gemiddelde in SQL Server 2012 is redelik eenvoudig. Die onderstaande figuur toon die windows beginsel. Huidige ry gemerk met 'n geel. Die venster is gemerk met 'n blou agtergrond. Die bewegende gemiddelde is eenvoudig die gemiddelde van QuoteClose in die blou lyne: T-SQL Moving gemiddelde venster. Die resultate van die berekeninge in ouer weergawes van SQL Server is dieselfde, so hulle sal nie weer gewys word. SQL Server 2005 8211 2008R2 Moving Gemiddelde Hierdie weergawe maak gebruik van 'n gemeenskaplike tafel uitdrukking. Die CTE is self gekla tot die laaste 20 rye vir elke ry te kry: Moving Gemiddelde voor SQL Server 2005 Die pre 2005 weergawe sal 'n links buitenste gebruik te sluit om dieselfde tafel met die laaste 20 rye te kry. Die buitenste tafel kan gesê word dat die venster wat ons wil 'n gemiddelde op te bereken bevat: Performance Vergelijking As ons die drie verskillende metodes gelyktydig hardloop en gaan die gevolglike uitvoering plan, daar is 'n dramatiese verskil in prestasie tussen die metodes: Vergelijking van drie verskillende metodes te bereken bewegende gemiddelde Soos jy kan sien, die windows funksie verbeterings in SQL 2012 maak 'n groot verskil in prestasie. Gebruik Soos in die begin van hierdie post, is bewegende gemiddeldes gebruik as 'n instrument om tendense te illustreer. 'N Algemene benadering is om bewegende gemiddeldes van verskillende lengtes te kombineer, ten einde veranderinge in die kort-, medium - en langtermyn tendense onderskeidelik te sien. Van besondere belang is die kruising van die tendens lyne. Byvoorbeeld, wanneer die kort tendens oor die lang of medium tendens beweeg, dit kan geïnterpreteer word as 'n koopsein in tegniese ontleding. En toe die kort tendens beweeg onder 'n langer tendens lyn, kan dit vertolk word as 'n sell sein. Die onderstaande grafiek toon Kwotasies, Ma20, Ma50 en Ma200. T-SQL Ma20, Ma50, Ma200 koop en verkoop seine. Hierdie blog post is deel van 'n reeks oor tegniese ontleding, TA, in SQL Server. Sien die ander poste hier. Geplaas deur Tomas Lindi het die bespreking wat jy genoem het gelees. Dit is van toepassing op PostgreSQL aangesien dit toegelaat word om die gebruiker-gedefinieerde totaal funksie met behulp van SQL in PostgreSQL te skep, maar nie toegelaat in SQL Server. Die gebruik van rekursiewe CTE is 'n haalbare manier SQL Server, maar ek sien dat CTE manier om meer tafel scan as venster funksies kan aangaan. So ek maak hierdie pos om te vra of dit moontlik is om eksponensiële bewegende gemiddelde met behulp van SQL Server 2012 venster funksie bereken net soos die berekening van eenvoudige bewegende gemiddelde. â € xiagao1982 14 April 13 by 02:53 In die eerste plek te bereken wat jy die EMO (SMA (x)) in plaas van die EMO (x). Tweedens, jou quotsmoothing constantquot is eintlik die beta waarde in my formule, nie die alfa. Met dié twee veranderinge die SQLFiddle lyk soos volg: sqlfiddle / 6/19192/1 Daar is egter nog 'n bietjie verskil tussen die werklike resultaat en die verwagte resultaat. Ek sou terug gaan kyk of hul EMO definisie ooreenstem met die een wat ek ken. â € Sebastian Meine 7 Mei 13 by 13:46 Ek het net gekyk na die Formule in die sigblad jy aangeheg en dit is ver van die standaard EMO definisie. My formule bereken die eksponensiële bewegende gemiddelde van die afgelope tien rye. Die sigblad bereken eers die standaard gemiddelde oor die afgelope tien rye en dan die onbeperkte eksponensieel geweeg bewegende gemiddelde oor die hele gemiddeldes. Dit volg op die Formule hier: en. wikipedia. org/wiki/EWMAchart uitvoering maak Sebastian Meine 7 Mei 13 by 13: 52AVG (Transact-SQL) ALLE Pas die totale funksie om alle waardes. Alles is die verstek. DISTINCT dui daarop dat, AVG uitgevoer word slegs op elke unieke geval van 'n waarde, ongeag hoeveel keer die waarde voorkom. uitdrukking is 'n uitdrukking van die presiese numeriese of geskatte numeriese data tipe kategorie, behalwe vir die tipe bietjie data. Totaal funksies en subqueries is nie toegelaat nie. OOR (partitionbyclause orderbyclause) partitionbyclause verdeel die resultaat stel wat deur die VANAF klousule in mure waaraan die funksie toegepas word. As nie gespesifiseer, die funksie behandel alle rye van die navraag gevolg gestel as 'n enkele groep. orderbyclause bepaal die logiese volgorde waarin die operasie uitgevoer word. orderbyclause word vereis. Vir meer inligting, sien OOR klousule (Transact-SQL). Die tipe terugkeer word bepaal deur die tipe van die geëvalueer gevolg van uitdrukking. desimale kategorie (p, s) As die tipe data van uitdrukking is 'n alias data tipe, die soort opbrengs is ook van die tipe alias data. Maar, as die tipe basis data van die alias datatipe bevorder, byvoorbeeld uit tinyint om Int. die terugkeer waarde is van die bevorder datatipe en nie die alias datatipe. AVG () bere die gemiddelde van 'n stel waardes wat deur die som van die waardes te deel deur die telling van nonnull waardes. As die som groter as die maksimum waarde vir die tipe data van die terugkeer waarde 'n fout sal teruggestuur word. AVG is 'n deterministiese funksie wanneer dit gebruik word sonder die oor en ORDER BY klousules. Dit is deterministiese wanneer gespesifiseerde met die oor en ORDER BY klousules. Vir meer inligting, sien Deterministiese en deterministiese funksies. A. Die gebruik van die som en AVG funksies vir berekeninge Die volgende voorbeeld word bereken dat die gemiddelde vakansie-ure en die som van siekteverlof ure wat die vise-presidente van Avontuur Werke Cycles gebruik. Elkeen van hierdie totaal funksies produseer 'n enkele opsomming waarde vir al die opgespoor rye. Die voorbeeld gebruik die AdventureWorks2012 database. How 'n SQL bewegende gemiddelde bereken sonder 'n wyser Update: As jy besig is met die nuutste weergawes van SQL Server, kan jy die windows funksies gebruik om dieselfde ding te bewerkstellig. Ek gepos word om die updated kode aan die einde van die post. Om hierdie video, ek nog graag die denkproses van anker om 'n datum. Video: 3 daagse bewegende gemiddelde in SQL 'n doeltreffende manier om 'n bewegende gemiddelde in SQL te bereken met behulp van 'n paar truuks op datum ankers stel. Daar is debatte oor die beste manier om 'n SQL bewegende gemiddelde in SQL Server doen. Sommige mense dink daar is tye wanneer 'n wyser is mees doeltreffende. Ander dink dat jy dit alles kan doen in 'n stel wat gebaseer is weg sonder die wyser. Die ander dag het ek gaan 'n bewegende gemiddelde te bereken en my eerste gedagte was om 'n wyser gebruik. Ek het 'n paar vinnige navorsing en het gevind dat hierdie forum vraag: Moving Gemiddelde in TSQL Daar is 'n pos wat 'n subquery met 'n anker datum te help vind die 1 en 2 dag geneutraliseer toon. Hier is die skrif wat jy kan gebruik om die 3 dag SQL Gemiddeld finale uitslag Moving toets. Hier is die finale navraag. Hier is die vraag wat jy sou gebruik met SQL Server 2012. Deel hierdie: Hi almal, Ive been wonder hoe om dit te doen, Ek het 'n navraag wat ek hardloop waar ek wil 'n 10 dag bewegende gemiddelde op die som hardloop (a. GBPRevenue ) waardes, ek het daarin geslaag om 'n kumulatiewe bedrag (met behulp van argief b), maar die bewegende gemiddelde is lastig :( Kies COUNT (DISTINCT a. OrderNumber) AS siteCount, COUNT (DISTINCT dbo. NewOrders. OrderNumber) AS TotalOrderAmountNewOrders, som (a doen. GBPRevenue) AS GBPRevenue, DATEADD (dag, DATEDIFF (dag, 19000101, a. BatchCompleted), 19000101) AS datum, (SELECT som (b. GBPRevenue) VAN dbo. Archive b WAAR DATEADD (dag, DATEDIFF (dag, 19000101, b. BatchCompleted), 19000101) Dit DATEADD (dag, DATEDIFF (dag, 19000101, a. BatchCompleted), 19000101) EN (KlientID 0 OF KlientID KlientID) EN (site of site 0)) AS cumulativeGBPRevenue GROUP BY DATEADD (dag, DATEDIFF (dag, 19000101, a. BatchCompleted), 19000101) Maandag, Maart 19, 2012 12:18 antwoorde gebruik CROSS toepassing met 'n TOP (10) binne. n 560439.26quot E 125505.63quot Labeled as antwoord deur Kalman Toth Moderator Saterdag Oktober 06, 2012 8:27 Ek het probeer om die 1ste benadering soos hierdie, maar die ekstra rye teruggekeer my som kolomme som (a. GBPRevenue) AS GBPRevenue, AVG (t2.GBPRevenue) AS GBPRevenueMovingAverage van JOIN dbo. Archive T2 oP DATEDIFF ( dag, a. BatchCompletedNoTime, t2.BatchCompletedNoTime) tussen 0 en 10 verklaar t tafel (datum DATETIME nie nul, koers float nie nul) in te voeg t getdate () te kies - 10, 1 unie al kies getdate () - 9, 2 unie al kies getdate () - 8, 4 unie al kies getdate () - 7, 4 unie al kies getdate () - 6, 5 unie al kies getdate () - 5, 6 unie al kies getdate () - 4, 6 unie al kies getdate () - 3, 8 unie al kies getdate () - 2, 9 unie al kies getdate () - 1, 10 unie al kies getdate () - 0, 11 unie al kies getdate () 431, 9 t kies. datum, avg (tt. rate) as simpleMovingAvg van t aS t sluit t tt op DATEDIFF (dag, tt. date, t. date) tussen 0 en 2 groep t. date bevel deur t. date Maandag, Maart 19, 2012 15:05 verklaar t tafel (datum DATETIME nie nul, koers float nie nul) in te voeg t getdate () te kies - 10, 1 unie al kies getdate () - 9, 2 unie al kies getdate () - 8, 4 unie al kies getdate () - 7, 4 unie al kies getdate () - 6, 5 unie al kies getdate () - 5, 6 unie al kies getdate () - 4, 6 unie al kies getdate () - 3, 8 unie al kies getdate () - 2, 9 unie al kies getdate () - 1, 10 unie al kies getdate () - 0, 11 unie al kies getdate () 431, 9 kies t. date, avg (tt. rate) as simpleMovingAvg uit t AS t sluit t tt op DATEDIFF (dag, tt. date, t. date) tussen 0 en 2 groep t. date bevel deur t. date - SwePeso SELECT d. Date, AVG (t. Rate) van T AS t CROSS geld (KIES 1, DATEADD (DAG, 0, t. Date) Unie Alle SELECT 0, DATEADD (DAG, 1, t. Date) Unie Alle SELECT 0, DATEADD (DAG, 2, t. Date)) AS d (Hou, Datum) GROEP DEUR d. Date WAT MAX (d. Keep) 1 N 560439.26quot E 125505.63quot Maandag, 19 Maart, 2012 15:24 op hierdie sub-kies dit gemaak eenvoudig eintlik (SELECT AVG (GBPRevenue) UIT dbo. Archive b WAAR (DATEDIFF (dag, a. BatchCompletedNoTime, b. BatchCompletedNoTime) tussen 0 en 10 EN (KlientID 0 OF b. clientID KlientID) EN (site of site 0))) AS GBPRevenueMovingAverage Geredigeer deur Quantum inligting Maandag , 19 Maart 2012 15:27 Labeled as antwoord deur Quantum inligting Maandag, 19 Maart, 2012 15:27 gemerk as antwoord deur Quantum inligting Maandag, 19 Maart, 2012 17:27 Maandag 19 Maart, 2012 03:27 PM Isnt dat gaan jou gee 'n 11 dag bewegende gemiddelde (tussen 0 en 10) Maandag, Maart 19, 2012 15:28 tabelle sleutels is dit wat jy bedoel Waarom dink jy omgee dat die inkomste is in GBP wat maak dat 'n heeltemal ander soort entiteit van ander inkomste CREATE TABLE OrderArchives (ordertimestamp DATETIME2 (3) nie leeg primêre sleutel, ordernbr heelgetaluitdrukking NIE NULL, revenueamt DESIMALE (18,2) NIE NULL) te voeg in OrderArchives WAARDES (2010/06/23 08:32 : 33,670, 606, 2252,68), (2010/06/23 09: 32: 31,453, 607, 2350,75), (2010/06/23 16: 05: 59,053, 008, 2535,49), (2010/06/27 04: 06: 46,103, 609, 274,54), (2010/06/29 12: 25: 50,483, 610, 2254,20), (2010/07/04 13: 49: 10,460, 601, 255,23), (2010/07/05 18 : 40: 03,083, 614, 1000,09) Die eerste probleem is dat jou specs is nie duidelik nie. Voor tien kalenderdae voor tien werksdae voor tien argief dae Die volgende probleem is dat jy 'n tyd stempel (DATETIME in T-SQL dialek) en wil data deur die dag. Laat ons dit doen in 'n CTE en kry daaglikse totale te bekom. Dan maak die 2012 venster klousule die res maklik. MET DailyOrderArchives (datum waarop u bestel, dailyrevenuetot) AS (SELECT datum waarop u bestel, SUM (revenueamt) VAN (SELECT CAST (ordertimestamp AS DATUM) AS datum waarop u bestel, revenueamt UIT OrderArchives) AS X GROUP BY datum waarop u bestel) - hier is 'n raaiskoot sonder duidelike specs KIES datum waarop u bestel, AVG (revenueamt) oor (ORDER bY datum waarop u bestel rye tussen 10 voorafgaande sowel as huidige ry) AS dailyrevenueamtrunningavg UIT DailyOrderArchives --CELKO-- Books in Celko Reeks vir Morgan-Kaufmann Publishing: Analytics en OLAP in SQL / Data en Databasisse: konsepte in die praktyk Data / Metings en Standaarde in SQL SQL vir Smarties / SQL Programmering Styl / SQL Puzzles en Antwoorde / Dink in stelle / Bome en hiërargieë in SQL Maandag, 19 Maart, 2012 15:37 dit is basies doen wat ek wil, Ive verdeel die navraag in 2 dele, enigste ding is dit is oor die algemeen die vervaardiging van hoër waardes as wat dit behoort vir die bewegende gemiddeldes :( VERKLAAR TBL TABEL (dailyGBPRevenue NUMERIC (18, 4), TotalOrderCountProcessedOrders INT, datum DATETIME) voeg in TBL SELECT som (a. GBPRevenue ) AS GBPRevenue, COUNT (DISTINCT a. OrderNumber), a. BatchCompletedNoTime UIT Argief n GROEP DEUR a. BatchCompletedNoTime SELECT a. date, a. dailyGBPRevenue, AVG (aa. dailyGBPRevenue) AS dailyGBPRevenueMvgAvg, a. TotalOrderCountProcessedOrders, AVG (aa. TotalOrderCountProcessedOrders ) AS TotalOrderCountProcessedOrdersMvgAvg UIT TBL n JOIN TBL aa OP DATEDIFF (dag, aa. date, a. date) tussen 0 en 10 WAAR a. date TUSSEN FROMDatum EN toDate GROUP BY a. date, a. dailyGBPRevenue, a. TotalOrderCountProcessedOrders Sorteer op datum Dinsdag, 20 Maart, 2012 04:18 is daar 'n maklike manier om dit te verander sodat dit kyk na die laaste 10 rye in plaas van die datum bereik JOIN TBL aa oP DATEDIFF (dag, aa. date, a. date) tussen 0 EN 10 Woensdag, 21 Maart, 2012 13:10 gebruik CROSS toepassing met 'n TOP (10) binne. N 560439.26quot E 125505.63quot Labeled as antwoord deur Kalman Toth Moderator Saterdag 6 Oktober, 2012 08:27 Woensdag 21 Maart, 2012 13:22 Microsoft is besig met 'n aanlyn-opname te dink jy van die webwerf van MSDN verstaan. As jy kies om deel te neem, sal die aanlyn-opname word aan jou wanneer jy die webwerf van MSDN verlaat. Wil jy om deel te neem Help ons verbeter MSDN. Besoek ons UserVoice Page in te dien en te stem oor idees
No comments:
Post a Comment