Skip to main content

Sql Bewegende Gemiddelde Oor


Ek is besig met SQL Server 2008 R2, probeer om 'n bewegende gemiddelde te bereken. Vir elke rekord in my mening, sou ek graag die waardes van die 250 vorige rekords in te samel, en bereken dan die gemiddelde vir hierdie seleksie. My mening kolomme is soos volg: TransactionID is uniek. Vir elke TransactionID. Ek wil graag die gemiddelde vir waarde kolom bereken, oor die vorige 250 rekords. So vir TransactionID 300, versamel al waardes van die vorige 250 rye (siening word gesorteer dalende deur TransactionID) en dan in kolom MovAvg skryf die resultaat van die gemiddeld van hierdie waardes. Ek is op soek na data in te samel binne 'n verskeidenheid van rekords. gevra 28 Oktober 14 aan 20: 58I ek probeer om doeltreffend te bereken (met behulp van SQL Server 2008) die bewegende gemiddelde van die ProductCount oor 'n tydperk van 24 uur. Vir elke ry in die produk tabel, id graag wou weet wat die gemiddelde van ProductCount (vir daardie gegewe produkte) oor die afgelope 24 uur. Een probleem met ons data, is dat nie al die datums / uur teenwoordig (sien voorbeeld hieronder) is. As 'n tyd stempel ontbreek, beteken dit dat die ProductCount was 0. Ek het 'n tafel met miljoene of rye met 'n datum, produk en graaf. Hier is 'n vereenvoudigde voorbeeld van die data wat ek het om te gaan met. Enige idee oor hoe om dit EDIT Daarvoor moet. Een ander stuk data wat ek nodig het, is die minimum en maksimum ProductCount vir die tydperk (maw 24 uur). Berekening van die min / maks is 'n bietjie moeiliker as gevolg van die vermiste values. How 'n SQL Bereken bewegende gemiddelde 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: Ek het data soos hieronder (met 30.000 verskillende items) en terwyl ek nog nie het 12 maande van weeklikse data wil ek 'n bewegende gemiddelde vir die afgelope 12 maande te skep (DATEADD (jjjj, -1, GETDATE ())). Dit sal elke week hardloop om ons gemiddelde inventaris vlak vir die afgelope 12 maande teen elke item te vang. Verder, ek moet hierdie terugwerkend hardloop na die rekords ek tans het (30 weke die moeite werd om vir elke item op die oomblik) te werk. Die terugwerkende is dit nodig om 'n gemiddelde net tot by die datum waarop die rekord is gevang neem, sodat vir die eerste datum waarop die item die gemiddelde sou wees op 'n rekord en vir die tweede datum, twee rekords, ens (Ek dink die huidige update sal moet verskillende T-SQL as die toekoms weeklikse werk). Die data lyk soos volg (die kolom aan die regterkant toon hoe dit moet lyk. Van Excel :)) Datum ItemNo Waarde 12mAve 01/06/2008 00:00 0003E 285,6465 285,6465 08/06/2008 00:00 0003E 377,9624 331,8045 15 / 06/2008 00:00 0003E 377,9624 347,1904 22/06/2008 00:00 0003E 377,9624 354,8834 29/06/2008 00:00 0003E 283,4718 340,6011 06/07/2008 00:00 0003E 283,4718 331,0796 13/07/2008 00:00 0003E 283,4718 324,2784 20/07/2008 00:00 0003E 188,9812 307,3663 27/07/2008 00:00 0003E 188,9812 294,2124 03/08/2008 00:00 0003E 188,9812 283,6893 10/08/2008 00:00 0003E 567,0228 309,4469 17/08 / 2008 00:00 0003E 567,0228 330,9115 24/08/2008 00:00 0003E 567,0228 349,0739 31/08/2008 00:00 0003E 567,0228 364,6417 07/09/2008 00:00 0003E 567,0228 378,1338 14/09/2008 00:00 0003E 567.0228 389.9393 21/09/2008 00:00 0003E 472,5190 394,7970 nickhodge (2009/02/20) Dankie vir beide jou hulp. Ek het hierdie werklike T-SQL maar dit keer uit (Tydverstreke verstryk). (Ek moet die inventaris waarde te bereken, maar probeer op 'n toets tafel met daardie pre-bereken, dieselfde probleem). Die enigste ding wat ek kan sien is dat dit voeg OUTER outomaties, maar dis waarskynlik die standaard KIES a. ItemNo, a. Date, AVG (b. QOH b. AveCost) AS 12mAve UIT dbo. WeeklyLoc1InventoryData as 'n links OUTER JOIN dbo. WeeklyLoc1InventoryData AS b op a. ItemNo a. ItemNo EN b. Date GT DATEADD (m, - 12, a. Date) EN b. Date Dit a. Date GROUP BY a. ItemNo, a. Date Enige leidrade (Ek hoop net ek havent het iets verkeerd in die T-SQL, maar moenie dink ek het) op 'n. ItemNo n. ItemNo --Jeff Moden RBAR uitgespreek gemsbok-bar en 'n Modenism vir R ow - B y a gonizing - R oe. Eerste stap in die rigting van die paradigmaskuif van skryf Stel Gebaseer kode: Hou op dink oor wat jy wil doen om 'n ry. dink, in plaas van wat jy wil doen om 'n kolom. Nuttige skakels: Hoe om kode probleme Hoe om prestasie problemsOVER klousule (Transact-SQL) PARTITION Post by verdeel die navraag gevolg gestel in mure te plaas. Die venster funksie is van toepassing op elke partisie afsonderlik en berekening weer begin vir elke partisie. valueexpression Spesifiseer die kolom waarvolgens die rowset verdeel word. valueexpression kan slegs verwys na kolomme beskikbaar gestel word deur die VANAF klousule. valueexpression kan nie verwys na uitdrukkings of aliasse in die kies lys. valueexpression kan 'n kolom uitdrukking, skalaar subquery, skalare funksie, of die gebruiker-gedefinieerde veranderlike wees. ltORDER DEUR clausegt Definieer die logiese volgorde van die rye in elke verdeling van die resultaat stel. Dit is, dit bepaal die logiese volgorde waarin die venster functioncalculation uitgevoer word. orderbyexpression Spesifiseer 'n kolom of uitdrukking waarop uit te sorteer. orderbyexpression kan slegs verwys na kolomme beskikbaar gestel word deur die VANAF klousule. 'N heelgetal nie gespesifiseer 'n naam of alias kolom verteenwoordig. Versamel collationname bepaal dat die ORDER BY werking moet uitgevoer word volgens die samestelling wat in collationname. collationname kan óf 'n Windows inbring naam of 'n SQL inbring naam wees. Vir meer inligting, sien vergelyking en Unicode ondersteuning. Versamel is van toepassing slegs vir kolomme van tipe char. varchar. nchar. en nvarchar. ASC DESC bepaal dat die waardes in die spesifieke kolom moet in stygende of dalende orde. ASC is die verstek sorteervolgorde. Nul waardes word beskou as die laagste moontlike waardes. Van toepassing is. SQL Server 2012 deur SQL Server 2016. Verdere beperkings die rye in die verdeling deur die spesifiseer van begin - en eindpunt binne die verdeling. Dit word gedoen deur die spesifiseer van 'n reeks van rye met betrekking tot die huidige ry óf deur logiese vereniging of fisiese vereniging. Fisiese assosiasie word bereik deur die gebruik van die RYE klousule. Die rye klousule beperk die rye binne 'n afsluiting met vermelding van 'n vaste aantal rye voor of na aanleiding van die huidige ry. Alternatiewelik, die reeks klousule beperk logies die rye binne 'n afsluiting met vermelding van 'n verskeidenheid van waardes met betrekking tot die waarde in die huidige ry. Voorafgaande en volgende rye word gedefinieer op grond van die bestel in die ORDER BY klousule. Die vensterraam REEKS huidige ry sluit alle rye wat dieselfde waardes in die orde is deur uitdrukking as die huidige ry. Byvoorbeeld, rye tussen 2 voorafgaande sowel as huidige ry beteken dat die venster van rye wat die funksie bedryf op drie rye in grootte, wat begin met 2 rye voor tot en met die huidige ry. Rye of REEKS vereis dat die ORDER BY klousule gespesifiseer word. As ORDER BY bevat verskeie einde uitdrukkings, huidige ry VIR REEKS oorweeg alle kolomme in die ORDER BY lys by die bepaling van die huidige ry. Van toepassing is. SQL Server 2012 deur SQL Server 2016 bepaal dat die venster begin by die eerste ry van die verdeling. Ongeleide VOORGAANDE kan slegs bepaal word as venster beginpunt. ltunsigned waarde specificationgt voorafgaande Gespesifiseerde met ltunsigned waarde specificationgtto dui die aantal rye of waardes van die huidige ry voorafgaan. Hierdie spesifikasie is nie toegelaat vir reeks. Van toepassing is. SQL Server 2012 deur SQL Server 2016 bepaal dat die venster begin of eindig by die huidige ry wanneer dit gebruik word met rye of die huidige waarde wanneer dit gebruik word met die reeks. Huidige ry kan gespesifiseer word as beide 'n begin - en eindpunt. TUSSEN ltwindow raam gebind GT EN ltwindow raam gebind GT van toepassing is. SQL Server 2012 deur SQL Server 2016. Gebruik met óf rye of reeks die laer (begin) spesifiseer en boonste (eindig) grens punte van die venster. ltwindow raam boundgt definieer die grens beginpunt en ltwindow raam boundgt definieer die grens eindpunt. Die bogrens kan nie kleiner as die ondergrens wees. Van toepassing is. SQL Server 2012 deur SQL Server 2016 bepaal dat die venster eindig by die laaste ry van die verdeling. Ongeleide volgende kan slegs bepaal word as 'n venster eindpunt. Byvoorbeeld wissel tussen huidige ry EN ongeleide VOLGENDE definieer 'n venster wat begin met die huidige ry en eindig met die laaste ry van die verdeling. ltunsigned waarde specificationgt volgende spesifieke met ltunsigned waarde specificationgt om die aantal rye of waardes dui op die huidige ry volg. Wanneer ltunsigned waarde specificationgt volgende is vermeld as die venster beginpunt, moet die eindpunt word ltunsigned waarde specificationgtFOLLOWING. Byvoorbeeld, rye tussen 2 volgende som en 10 VOLGENDE definieer 'n venster wat begin met die tweede ry dat die huidige ry volg en eindig met die tiende ry dat die huidige ry volg. Hierdie spesifikasie is nie toegelaat vir reeks. ongetekende heelgetal letterlike toepassing is. SQL Server 2012 deur SQL Server 2016 is 'n positiewe heelgetal letterlike (insluitende 0) dat die aantal rye of waardes te voorafgaan of volg die huidige ry of waarde spesifiseer. Hierdie spesifikasie is net geldig vir rye.

Comments