Tuesday, 10 October 2017

Flytte Gjennomsnittet In Sql 2008


Jeg jobber med SQL Server 2008 R2, og prøver å beregne et glidende gjennomsnitt. For hver post som jeg ser, vil jeg gjerne samle verdiene til de 250 tidligere postene, og deretter beregne gjennomsnittet for dette valget. Visningskolonnene mine er som følger: TransactionID er unikt. For hvert TransaksjonsID. Jeg vil gjerne beregne gjennomsnittet for kolonneverdi, over tidligere 250 poster. Så for TransactionID 300, samle alle verdier fra tidligere 250 rader (visningen sorteres synkende av TransactionID) og deretter i kolonne MovAvg skrive resultatet av gjennomsnittet av disse verdiene. Jeg ønsker å samle inn data innenfor en rekke poster. spurte 28. okt 14 kl 20: 58 Jeg prøver å ha en løpende gjennomsnittskolonne i SELECT-setningen basert på en kolonne fra n forrige rad i samme SELECT-setning. Gjennomsnittet jeg trenger er basert på n tidligere rader i resultatsettet. De tre første radene i gjennomsnitts-kolonnen er null fordi det ikke finnes noen tidligere rader. Rækken 4 i gjennomsnittskolonnen viser gjennomsnittet av tallkolonnen fra de foregående 3 radene. Jeg trenger litt hjelp med å prøve å konstruere en SQL Select-setning som vil gjøre dette. En enkel selvtillitstilgang ser ut til å fungere mye bedre enn en rad referanse subquery Generer 10k rader av testdata: Jeg ville trekke spesialsaken til de første 3 radene ut av hovednavnet, du kan UNION ALL de tilbake i hvis du virkelig vil det i raden sett. Selvmeldeforespørsel: På min maskin tar dette ca. 10 sekunder, den subquery-tilnærmingen som Aaron Alton demonstrerte, tar omtrent 45 sekunder (etter at jeg endret den for å gjenspeile testkildetabellen): Hvis du gjør en SET STATISTICS PROFILE ON, kan du se selvtillit er 10k kjører på bordspolen. Underkunden har 10k kjør på filteret, aggregatet og andre trinn. Ifølge beskrivelsen har du en matrise i rapporten. Nå vil du beregne gjennomsnittsverdien for siste 6 måneder. Rett i Reporting Service, kan vi sette tilpasset kode i rapport for å håndtere komplisert logikk. Legg til en ekstra kolonnevegg innsiden av gruppen og ring funksjonene som er definert i egendefinert kode. For ditt krav endret vi Roberts kode for å nå målet ditt. Vi testet saken i vårt lokale miljø med prøvedata. Her er trinn og skjermbilder som referanse: Sett den egendefinerte koden inn i rapporten: Privat køLengde som helhet 6 Privat køSom som dobbel 0 Privat køFull som boolsk False Privat IDEndre som Stringquotquot Dim kø Som nytt system. Collections. Generic. Queue (Of Integer) Offentlig funksjon CumulativeQueue (ByVal currentValue som integer, ID som streng) Som objekt dim fjernetValue som dobbel 0 Hvis idChange Litt id deretter ClearQueue () idVis ID-køSum 0 queueFull False CumulativeQueue (currentValue, id) Else Hvis kø. Count gt queueLength Then removedValue kø. Dequeue () Slutt Hvis køSammen 43 currentValue queueSum - removedValue queue. Enqueue (currentValue) Hvis kø. Count lt queueLength Then Return Nothing ElseIf queue. Count queueLength Og queueFull False Then queueFull True Return QueueSum queueLength Else Return (queueSum) queueLength End Hvis End Hvis End Funksjon offentlig funksjon ClearQueue () Dim jeg som Integer Dim n som Integer Queue. Count-1 for inn til 0 Trinn-1 kø. Dequeue () neste jeg Sluttfunksjon Legg til en ekstra rad inne i gruppen, ring funksjonen som er definert i egendefinert kode. Lagre og forhåndsvise. Det ser ut som nedenfor: Hvis du har spørsmål, vær så snill å spørre. Med vennlig hilsen, Simon Hou (Pactera) Onsdag 14. mai 2014 12:36 Alle svar Yep. du kan bruke RunningValue-funksjonen for dette noe som under. Vennligst merk dette som svar hvis det hjelper å løse problemet Visakh --------------------------- - visakhm. blogspot facebookVmBlogs Ifølge beskrivelsen har du en matrise i rapporten. Nå vil du beregne gjennomsnittsverdien for siste 6 måneder. Rett i Reporting Service, kan vi sette tilpasset kode i rapport for å håndtere komplisert logikk. Legg til en ekstra kolonnevegg innsiden av gruppen og ring funksjonene som er definert i egendefinert kode. For ditt krav endret vi Roberts kode for å nå målet ditt. Vi testet saken i vårt lokale miljø med prøvedata. Her er trinn og skjermbilder som referanse: Sett den egendefinerte koden inn i rapporten: Privat køLengde som helhet 6 Privat køSom som dobbel 0 Privat køFull som boolsk False Privat IDEndre som Stringquotquot Dim kø Som nytt system. Collections. Generic. Queue (Of Integer) Offentlig funksjon CumulativeQueue (ByVal currentValue som integer, ID som streng) Som objekt dim fjernetValue som dobbel 0 Hvis idChange Litt id deretter ClearQueue () idVis ID-køSum 0 queueFull False CumulativeQueue (currentValue, id) Else Hvis kø. Count gt queueLength Then removedValue kø. Dequeue () Slutt Hvis køSammen 43 currentValue queueSum - removedValue queue. Enqueue (currentValue) Hvis kø. Count lt queueLength Then Return Nothing ElseIf queue. Count queueLength Og queueFull False Then queueFull True Return QueueSum queueLength Else Return (queueSum) queueLength End Hvis End Hvis End Funksjon offentlig funksjon ClearQueue () Dim jeg som Integer Dim n som Integer Queue. Count-1 for inn til 0 Trinn-1 kø. Dequeue () neste jeg Sluttfunksjon Legg til en ekstra rad inne i gruppen, ring funksjonen som er definert i egendefinert kode. Lagre og forhåndsvise. Det ser ut som nedenfor: Hvis du har spørsmål, vær så snill å spørre. Med vennlig hilsen, Simon Hou (Pactera) Onsdag 14. mai 2014 12:36 Microsoft gjennomfører en onlineundersøkelse for å forstå din oppfatning av Technets nettsted. Hvis du velger å delta, vil onlineundersøkelsen bli presentert for deg når du forlater Technets nettsted. Ønsker du å delta 2017 Microsoft. Alle rettigheter reservert.

No comments:

Post a Comment