Tuesday 10 October 2017

Sql Server Moving Average Spørring


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. oktober klokken 20:58 Dette er et Evergreen Joe Celko spørsmål. Jeg ignorerer hvilken DBMS-plattform som brukes. Men i hvert fall kunne Joe svare på mer enn 10 år siden med standard SQL. Joe Celko SQL Puslespill og svar citation: Det siste oppdateringsforsøket antyder at vi kunne bruke predikatet til å konstruere en spørring som ville gi oss et bevegelige gjennomsnitt: Er den ekstra kolonnen eller spørringsmetoden bedre Spørringen er teknisk bedre fordi UPDATE-tilnærmingen vil deformalisere databasen. Men hvis de historiske dataene som blir registrert ikke kommer til å endres og beregning er det bevegelige gjennomsnittet dyrt, kan du vurdere å bruke kolonne tilnærming. SQL Puslespørsmål: for all del uniform. Du kaster bare til riktig vektbøtte, avhengig av avstanden fra det nåværende tidspunktet. For eksempel kvittve vekt1 for datapoints innen 24 timer fra nåværende datapoint weight0.5 for datapoints innen 48hrsquot. Det saken betyr det hvor mye datapoints som er på hverandre (som 6:12 og 11:48) er fjernt fra hverandre. En brukstilstand jeg kan tenke på, ville være et forsøk på å glatte histogrammet hvor datapunkter ikke er tette nok ndash msciwoj 27. mai kl 15 22:22 Jeg er ikke sikker på at ditt forventede resultat (utgang) viser klassisk enkelt bevegelige (rullende) gjennomsnitt i 3 dager. Fordi, for eksempel, gir den første trippen av tall per definisjon: men du forventer 4,360 og det er forvirrende. Likevel foreslår jeg følgende løsning, som bruker vindufunksjon AVG. Denne tilnærmingen er mye mer effektiv (klar og mindre ressursintensiv) enn SELF-JOIN introdusert i andre svar (og jeg er overrasket over at ingen har gitt en bedre løsning). Du ser at AVG er innpakket med et tilfelle når rownum gt p. days deretter tvinge NULL s i første rader, hvor 3 dagers Moving Average er meningsløs. besvart 23 februar 16 kl 13:12 Vi kan bruke Joe Celkos skitne venstre ytre tilkoblingsmetode (som nevnt ovenfor av Diego Scaravaggi) for å svare på spørsmålet som det ble spurt. Genererer den forespurte produksjonen: Besvart 9. jan kl. 0:33 Ditt svar 2017 Stack Exchange, Inc Tidligere diskuterte vi hvordan du skriver rullende gjennomsnitt i Postgres. Av populær etterspørsel viste du hvordan du gjør det samme i MySQL og SQL Server. Godt omslag Slik annoterer du støyende diagrammer som dette: Med en 7-dagers tidligere gjennomsnittlig linje slik: Den store ideen Vår første graf over er ganske støyende og vanskelig å få nyttig informasjon fra. Vi kan glatte det ut ved å plotte et 7-dagers gjennomsnitt på toppen av de underliggende dataene. Dette kan gjøres med vindufunksjoner, selvforbindelser eller korrelerte undersøkelser - dekke de to første. God start med et foregående gjennomsnitt, noe som betyr at gjennomsnittspunktet på den 7. i måneden er gjennomsnittet av de første syv dagene. Visuelt skifter toppene toppene i grafen til høyre, da en stor topp er gjennomsnittet i løpet av de følgende sju dagene. Først oppretter du en mellomtalltabel Vi vil beregne et gjennomsnitt over de totale registreringene for hver dag. Forutsatt at vi har en typisk bruker tabell med en rad per ny bruker og en tidsstempel createdat, kan vi opprette vårt aggregat vårt registreringsbord slik: I Postgres og SQL Server kan du bruke dette som en CTE. I MySQL kan du lagre det som en midlertidig tabell. Postgres Rolling Average Heldigvis har Postgres vindufunksjoner som er den enkleste måten å beregne et løpende gjennomsnitt på. Denne spørringen antar at datoene ikke har hull. Spørringen er gjennomsnittlig i løpet av de siste syv radene, ikke de siste syv datoene. Hvis dataene dine har hull, fyll dem inn med generateseries eller bli med et bord med tette dataarker. MySQL Rolling Average MySQL mangler vindusfunksjoner, men vi kan gjøre en lignende beregning ved hjelp av selvforbindelser. For hver rad i vårt taletabell, blir vi med på hver rad som var i løpet av de siste syv dagene og tar gjennomsnittet. Denne spørringen håndterer automatisk hull i datoen, ettersom vi ser på rader innenfor et datoperiode i stedet for de foregående N-radene. SQL Server Rolling Average SQL Server har vindufunksjoner, slik at beregning av rullende gjennomsnitt kan gjøres i enten Postgres-stilen eller MySQL-stilen. For enkelhet, brukte MySQL-versjonen med en selvtillit. Dette er konseptuelt det samme som i MySQL. De eneste oversettelsene er dateadd-funksjonen og eksplisitt navngitt gruppe etter kolonner. Andre gjennomsnitt Vi fokuserte på 7-dagers etterfølgende gjennomsnitt i dette innlegget. Hvis vi ønsket å se på det 7-dagers ledende gjennomsnittet, er det så enkelt som å sortere datoene i den andre retningen. Hvis vi ønsket å se på et sentrert gjennomsnitt, bruker vi: Postgres: rader mellom 3 forrige og 3 etter MySql: mellom signups. date - 3 og signups. date 3 i MySQL SQL Server: mellom dateadd (dag, -3, registreringer. dato) og dateadd (dag, 3, signups. date) AVG (Transact-SQL) ALL Bruker aggregatfunksjonen til alle verdier. ALLE er standard. DISTINCT Angir at AVG bare skal utføres på hver unikt forekomst av en verdi, uavhengig av hvor mange ganger verdien oppstår. uttrykk Er et uttrykk for den eksakte numeriske eller omtrentlige numeriske datatypekategorien, bortsett fra bitdatatypen. Aggregate funksjoner og subqueries er ikke tillatt. OVER (partitionbyclause orderbyclause) partitionbyclause deler resultatet settet fra FROM-klausulen til partisjoner som funksjonen blir brukt på. Hvis ikke spesifisert, behandler funksjonen alle rader av spørringsresultatet som en enkelt gruppe. orderbyclause bestemmer den logiske rekkefølgen der operasjonen utføres. orderbyclause er påkrevd. For mer informasjon, se OVER Klausul (Transact-SQL). Returtypen bestemmes av typen av det evaluerte resultatet av uttrykket. desimal kategori (p, s) Hvis datatypen for uttrykket er en alias datatype, er retur typen også av alias datatypen. Men hvis grunndatatypen for aliasdatatypen fremmes, for eksempel fra tinyint til int. returverdien er den fremrykkede datatypen og ikke aliasdatatypen. AVG () beregner gjennomsnittet av et sett med verdier ved å dividere summen av disse verdiene ved telling av nonnull-verdier. Hvis summen overskrider maksimumsverdien for datatypen til returverdi, returneres en feil. AVG er en deterministisk funksjon når den brukes uten OVER og ORDER BY-klausulene. Det er nondeterministic når det er angitt med OVER og ORDER BY-klausulene. For mer informasjon, se Deterministiske og Nondeterministiske funksjoner. A. Bruke SUM - og AVG-funksjonene til beregninger Følgende eksempel beregner gjennomsnittlig ferietid og summen av sykefravær som vicepresentanter for Adventure Works Cycles har brukt. Hver av disse aggregatfunksjonene produserer en enkelt sammendragsverdi for alle de hentede radene. Eksemplet bruker AdventureWorks2012-databasen.

No comments:

Post a Comment