Saturday, 11 November 2017

Flytte Gjennomsnittet Sql Server 2008


Jeg prøver å ha en løpende gjennomsnittskolonne i SELECT-setningen basert på en kolonne fra de n forrige radene i samme SELECT-setningen. Det gjennomsnittet jeg trenger er basert på de n foregående radene i resultatene. De første 3 radene i gjennomsnitts kolonnen er null fordi det ikke finnes noen tidligere rader Rækken 4 i gjennomsnitts kolonnen 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 selvtillit vil virke å utføre mye bedre enn en rad referanse subquery. Generate 10k rader av test data. I ville trekke spesielle tilfelle av de første 3 radene ut av hovednavnet, kan du UNION ALLE de tilbake i hvis du virkelig vil ha det i rad sett Selvmeldeforespørsel. På min maskin tar dette ca. 10 sekunder, og undersøkelsesmetoden som Aaron Alton demonstrerte tar omtrent 45 sekunder etter at jeg har endret den for å reflektere testkildetabellen. Hvis du gjør en SET STATISTICS PROFILE ON, kan du se selvtillit har 10k kjører på ta ble spool Subquery har 10k kjører på filteret, aggregatet og andre trinn. Jeg jobber med SQL Server 2008 R2, prøver å beregne et glidende gjennomsnitt. For hver post i min visning vil jeg gjerne samle verdiene til de 250 tidligere registrerer og beregner deretter gjennomsnittet for dette valget. Mine synkolonner er som følger. TransaksjonsID er unikt For hvert TransaksjonsID vil jeg gjerne beregne gjennomsnittet for kolonneverdi over tidligere 250 poster, så for TransactionID 300, samle alle verdier fra forrige 250 radevisning sorteres synkende av TransactionID og deretter i kolonne MovAvg skrive resultatet av gjennomsnittet av disse verdiene jeg ser for å samle inn data innenfor et område av records. asked 28 oktober 14 på 20 58.Rolling-gjennomsnitt i SQL Server. Aggregate funksjoner er praktisk de løser et forretningsbehov og de gjør utviklingen enkelt Dessverre er ikke alle forretningskravene så enkle å løse La oss se på et eksempel rullende gjennomsnitt. Rullende gjennomsnitt. Et rullende gjennomsnitt er en Enkelt konsept et gjennomsnitt beregnes over en fast delmengde av data. Rullende gjennomsnittlige beregninger brukes oftest med tidsseriedata og bidrar til å fjerne kortsiktige fluktuasjoner samtidig som det fremheves langsiktige trender. Bruksregninger har ofte et rullende gjennomsnitt av forbruket for å hjelpe kunden med å forstå deres bruk Forbrukerne er ikke opptatt av at elektrisitetsforbruket er høyt en dag i august da det var en varmebølge de vil se hvordan forbruket deres endrer seg over tid. Sammenligning av gjennomsnitt med vanlige tabelluttrykk 2005 2008R2.Start med SQL Server 2005 ble det lett å skrive et rullende gjennomsnitt i en enkelt T-SQL-setning ved hjelp av en Common Table Expression CTEs ble raskt populær. En utrolig mengde tidligere vanskelig funksjonalitet ble gjort mulig gjennom CTEer, inkludert rekursive spørringer og rullende gjennomsnitt. Se på dette eksempelet i prøveeksemplaret AdventureWorks2012. . Selv om ikke den mest enkle tilnærmingen til å bygge et rullende gjennomsnitt, CTE klarer å få jobben I denne spørringen bruker vi CTE til å lage et arbeidsbord og deretter utføre en selvtillit. Denne samme typen ting er mulig ved hjelp av en midlertidig tabell - eller tabellvariabel, men CTE fullfører den i en setning og er uten tvil lettere å readmon Table Expressions skjuler også en mørk hemmelig SQL Server utfører CTE-kroppen hver gang CTE-uttrykket, cte i dette eksemplet, refereres. Jo mer komplisert Common Table Expression er, jo mer arbeid som har å bli utført Kjører dette rullende gjennomsnittet med STATISTIKK IO slått på, er det enkelt å se flere henrettelser i form av to skanninger på hver tabell. I en database dette lille, utgjør dette ikke store ytelsesproblemer, men dette vil føre til stor problemer for en moderat størrelse database. Rolling Gjennomsnitt med Window Funksjoner 2012 og utover. SQL Server 2012 ga bedre støtte for windowing funksjoner Selv om støtte for OVER allerede var tilgjengelig i SQL Server 2005, SQL Server 2012 brin gs betydelig mer funksjonalitet til bordet Ved å bruke ROW eller RANGE-klausulen i vindusfunksjonen, er det mulig å forenkle spørringen og forbedre ytelsen Ta en titt Selv om de to spørringene er bemerkelsesverdig forskjellige, er den største forskjellen innføringen av ROWS 12 PRECEDING Dette tar seg selv til å bli med i det forrige eksemplet. I stedet for å skrive ut en samling, forteller vi bare SQL Server at vi liker gjennomsnittlig st over de siste 12 radene sortert etter år og måned. Hvilken type effekt har dette på jobben utfører SQL Server.111 leser i stedet for 369 leser. Denne endringen gjør det klart for en betydelig ytelsesforbedring for SQL Server. Vi har redusert antall lesninger, eliminert noen spørrekompleksitet og gjort det noe tydelig for fremtidige utviklere hvordan de kunne endre eller bygge videre på dette fremover Endre den nye spørringen til et rullende gjennomsnitt per dag i stedet for etter måned er enkelt og krever enda færre linjer med kode Dette utfører navnet e antall logiske og fysiske leser som det månedlige rullende gjennomsnittet ved hjelp av en vindufunksjon. Der har du to forskjellige måter å utføre et rullende gjennomsnitt på i SQL Server One-metoden er tydelig mye enklere enn det andre. Det finnes en rekke optimaliseringer i SQL Server 2012 for å gjøre det enkelt for deg å bygge denne funksjonaliteten og forbedre SQL Server-ytelsen på samme tid. Takk Jeremiah Jeg er akkurat nå i midten av å migrere et 2008R2-system som beregner SMA EMA MACD s til SQL 2012 Det bruker R2 s vinduesfunksjon OVER, men må bruke ROWNUMBER og gjøre litt ekstra matte på grunn av mangelen på den nye 2012 ROWS PRECEDING-klausulen. Jeg elsker den nye ROWS PRECEDING. Og ytelsen er WAY raskere i 2012 enn den var i R2. Takk for eksemplene. Du er velkommen Takk for at du deler litt om din brukstilstand du har slått på en annen teknikk som jeg har brukt med noen moderat suksess på SQL Server 2008R2 og tidligere kombinere ROWNUMBER med en semi-join for å utføre SUM AVG osv. Jeg håper din migrasjon går jevnt.

No comments:

Post a Comment