Tuesday, 7 November 2017

Glidande medelvärde sql server 2008


Jag jobbar med SQL Server 2008 R2, försöker beräkna ett glidande medelvärde. För varje post enligt min uppfattning vill jag samla värdena för de 250 tidigare posterna och beräkna sedan genomsnittet för det här urvalet. Mina synkolumner är följande: TransaktionsID är unik. För varje TransaktionsID. Jag skulle vilja beräkna medelvärdet för kolumnvärde, över tidigare 250 poster. Så för TransactionID 300, samla alla värden från tidigare 250 rader (vy sorteras nedåt med TransactionID) och sedan i kolumnen MovAvg skriv resultatet av genomsnittet av dessa värden. Jag letar efter att samla in data inom en rad poster. frågade 28 okt 14 kl 20:58 Jag försöker att ha en löpande medelkolumn i SELECT-satsen baserat på en kolumn från de n föregående raderna i samma SELECT-sats. Det genomsnittliga jag behöver är baserat på de n föregående raderna i resultaten. De första 3 raderna i medelkolumnen är null eftersom det inte finns några tidigare rader. Raden 4 i kolumnen Genomsnitt visar medelvärdet av kolumnen Antal från de föregående 3 raderna. Jag behöver lite hjälp med att försöka konstruera ett SQL Select-meddelande som gör det här. En enkel självförening verkar fungera mycket bättre än en rad referensunderfråga Generera 10k rader av testdata: Jag skulle dra specialfallet av de första 3 raderna ur huvudfrågan, du kan UNION ALL de tillbaka i om du verkligen vill det i raduppsättningen. Självsammanfogningsfråga: På min maskin tar det ungefär 10 sekunder, det subquery-tillvägagångssätt som Aaron Alton demonstrerade tar ungefär 45 sekunder (efter att jag ändrat det för att reflektera min testkälla tabell): Om du gör en SET STATISTICS PROFILE ON, kan du se självförening har 10k exekverar på bordspolen. Underfrågan har 10k körs på filteret, aggregatet och andra steg. Jag vill beräkna det rörliga genomsnittet på kolumn C4 och C5 med 3 poster i genomsnitt och resultatet ska matas ut till en annan tabell. Tack på förhand. Datum Tid mS C4 C5 08052012 0:00 00: 00.0 0.100341 45.75981 43.77025 08052012 0:00 00: 01.0 0.09143 45.4046 44.39561 08052012 0:00 00: 02.0 0.094116 44.87945 43.88213 08052012 0:00 00: 03.0 0.099365 45.75981 44.76503 08052012 0:00 00 : 04.0 0.09143 44.35193 44.35193 08052012 0:00 00: 05.0 0.093383 46.90839 43.91423 08052012 0:00 00: 06.0 0.098632 45.75981 43.77025 08052012 0:00 00: 07.0 0.09143 46.3337 45.32644 08052012 0:00 00: 08.0 0.092651 45.9439 45.9439 08052012 0:00 00 : 09.0 0.0979 44.76503 44.76503 08052012 0:00 00: 10.0 0.094848 46.14082 45.13776 08052012 0:00 00: 11.0 0.091918 46.13517 45.13224 08052012 0:00 00: 12.0 0.097167 44.76503 44.76503 08052012 0:00 00: 13.0 0.182495 46.06902 44.22626 08052012 0:00 00 : 14.0 0.09143 45.10773 44.00755 08052012 0:00 00: 15.0 0.096435 45.77092 43.78088 08052012 0:00 00: 16.0 0.09143 47.23642 43.2163 08052012 0:00 00: 17.0 0.091308 47.00573 43.00525 08052012 0:00 00: 18.0 0.095703 45.79871 44.80309 08052012 0:00 00 : 19,0 0,09143 45,19311 44,188882 08052012 0:00 00: 20,0 0,091308 46,00561 45,00549 08052012 0:00 00: 21,0 0,09497 44,83581 44,83581 08052012 0:00 00: 22,0 0,09143 45,15987 45,15987 08052012 0:00 00: 23,0 0,09143 47 46 08052012 0:00 00: 24,0 0,094238 47,86559 46,86839 08052012 0:00 00: 25.0 0.099365 48.75006 46.76026 08052012 0:00 00: 26.0 0.09143 48.38393 46.36793 08052012 0:00 00: 27.0 0.093505 47.90061 44.90682 08052012 0:00 00: 28.0 0.098754 47.74936 47.74936 Tisdag 23 april 2013 10:21 Naomi har rätt, du saknar en semikolon före med uttalandet. jag har lagt till avg calc för C4 och C5 i koden nedan, Hälsningar, Dineshkumar, Vänligen markera som svar om mitt inlägg svarar på din fråga och Rösta som användbart om det hjälper dig Markerad som svar av kkcci88888 onsdag 24 april 2013 6: 47 AM onsdag 24 april, 2013 5:12 AM Alla svar Vänligen skriv in din tabelldefinition, provdataförstärkare Nödvändigt RESULTAT SET Vänligen markera som svar om mitt inlägg fungerar för dig eller Rösta som användbart om det hjälper dig. Junaid Hassan. Tisdagen den 23 april 2013 10:29 Precis som en teaser: VÄLJ DATUM, AVG (C4) ÖVER (BESTÄLL AV DATUM RAD MELLAN 2 PRECEDING OCH LÖPANDE RÅD), AVG (C5) ÖVER (BESTÄLL AV DATUM RADER MELLAN 2 FÖRBEREDELSER RÅD) FRÅN tbl Det här fungerar inte för dig, eftersom den här syntaxen endast är tillgänglig på SQL 2012. Jag nämner det, för om du har behov av att beräkna saker som glidande medelvärde är detta ett starkt incitament att flytta till SQL 2012. Medan De andra lösningarna som presenteras i tråden kommer att fungera, ovanstående kommer att fungera mycket bättre. Erland Sommarskog, SQL Server MVP, esquelsommarskog. se Föreslagna som svar från Naomi N Moderator Onsdagen den 24 april 2013 12:22 Tisdag 23 april 2013 11:14 Onsdag 24 april 2013 12:58 Fel. Vänligen ge dig ytterligare råd. Onsdag 24 april, 2013 1:24 Prövat du lösningen som jag postade ovan. vad var resultatet Hälsningar, Dineshkumar, Var god Markera som svar om mitt inlägg svarar på din fråga och Rösta som användbart om det hjälper dig onsdagen den 24 april 2013 02:37 Hej, Dineshkum ar Tack, men från din lösning behöver du manuellt plugga in de raka posterna ELLER kan du ytterligare ge råd om automatisk flyttning av dokumenten (eftersom vi har över 3.000.000 poster i tabellen.) BTW, jag är på väg att installera SQL2012 och försöka med en annan lösning härifrån. I värsta fall kommer jag att skriva ett VB-program för att göra det men det tar tid och långsam prestanda. Onsdag 24 april 2013 3:31 Du måste ersätta tabellen med ditt tabellnamn och du behöver inte kod före det uttalande - det användes endast för att SIMULERA dina data. Vad gäller felet med Erlands lösning - läste du sin kommentar noga. Hans lösning fungerar bara i SQL Server 2012 och det fungerar inte i tidigare versioner av SQL Server. För varje expert finns det en lika och motsatt expert. - Beckers Law Wednesday, April 24, 2013 3:34 AM Precis som en teaser: VÄLJ DATUM, AVG (C4) ÖVER (BESTÄLL AV DATUM RADER MELLAN 2 PRECEDING OCH CURRENT ROW), AVG (C5) ÖVER (BESTÄLL AV DATUM TID RÄM MELLAN 2 PRECEDING CURRENT ROW) FRÅN tbl Detta fungerar inte för dig eftersom den här syntaxen endast är tillgänglig på SQL 2012. Det är en våldsam kränkning av ren relationsdatabassteori och jag gillar det väldigt mycket onsdagen den 24 april 2013 03:43 Kan du vänligen ändra din SQL för att producera bifogade. (Jag vill ha det glidande medlet på C4 och C5 kolumner). De 3.000.000 raderna av tabellnamn är dbo. myDB. Over3M Tack så mycket. Onsdagen den 24 april 2013 03:47 Onsdagen den 24 april 2013 15:53 ​​Felmeddelandet är mycket exakt och berättar exakt vad du behöver lägga till framför med-uttalandet. För varje expert finns det en lika och motsatt expert. - Beckers Law onsdag 24 april, 2013 4:05 PM sql 2012 är inte ren relationsdatabas :-) du kan också använda kolumnstoreindex. Onsdag 24 april 2013 4:47 Tyvärr är den här lösningen bara för SQL 2012. Det är därför det kastar fel. Kör det på SQL 2012. Om (hjälpsam) sedan Rösta () Onsdag den 24 april 2013 05:06 Naomi har rätt, du saknar en semikolon före med uttalande. jag har lagt till avg calc för C4 och C5 i koden nedan, Hälsningar, Dineshkumar, Vänligen markera som svar om mitt inlägg svarar på din fråga och Rösta som användbart om det hjälper dig Markerad som svar av kkcci88888 onsdag 24 april 2013 6: 47 AM onsdag 24 april 2013 5:12 Du är bra och det verkar bra men det tar redan över 30 minuter (okej hur länge det tar att beräkna 3 000 000 poster.) BTW, jag behöver beräkna det rörliga genomsnittet och mata ut till ett bord, efteråt måste jag gruppera det till 10 minuter och ta MAX av avgc4 och avgc5. ytterligare råd om hur man beräknar eller jag måste vänta på att resultatet genereras och använd en annan fråga för att gruppera efter datetime i 10 minuter poster och utföra MAX på avgc4 avgc5. Tack så mycket igen. Onsdag 24 april 2013 06:54 Kan du snälla utreda din fråga lite mer om den gruppen 10 minuter Om du skulle kunna ge ett exempel (kan vara en DDL) med provdata och din förväntade effekt, skulle det vara till hjälp för förstå kravet Hälsningar, Dineshkumar, Var god markera som svar om mitt inlägg svarar på din fråga och Rösta som användbart om det hjälper dig onsdagen den 24 april 2013 07:15 Om din nya tabell (var du ville lagra data) är inte ändå skapad. använd den här sättet, välj "Quotselect" i kommentarhilsen, Dineshkumar, Var god markera som svar om mitt inlägg svarar på din fråga och Rösta som användbart om det hjälper dig onsdagen den 24 april 2013 07:23 Hej, Dineshkum ar Det här är den fråga jag använde att gruppera poster i 10 minuter Resultatet jag skulle vilja ha är (1) Skapa det glidande genomsnittet på var tredje sekund på kolumn C4 C5 (2) gruppen av posten som punkt (1) till 10 minuter (dvs varje 60x10 poster), använd MAX (avgc4). MAX (avgc5) Så det avsedda slutresultatet är Datum, Tid, Max (Movingavgc4) av varje 10 minuters poster, Max (Movingavgc5) varje 10 minuter spelar onsdag den 24 april 2013 07:47 Hej, Dineshkum ar Kan du snälla kolla på syntaxen eftersom det fick fel. BTW, efter sprang över i 2,1 timmar, avbryter jag det och utmatningen är bara 94019 poster. ut bord innehåller 3.000.000 så det behöver cirka 65 timmar. Onsdag den 24 april 2013 kl. 08:46 Lägg din tabellenamn i stället för quotyournewtablequot till ovanstående script. du behöver inte använda den quotselecten till db0.dlamvagquot i din kod. Jag nämnde just quotselect inquot för att visa att det är en metod för att infoga valda poster i ett nytt bord, eftersom inläggning till existerande poster har en annan syntax Hälsningar, Dineshkumar, Var god markera som svar om mitt inlägg svarar på din fråga och Rösta som användbart om det hjälper dig Redigerad av Dinesh Kumar Rajendran onsdag 24 april 2013 08:58 onsdag 24 april 2013 08:55 tack. det går nu. Onsdag den 24 april 2013 09:06 Det går för 17 timmar nu men det finns ingen rekordutgång till newtable. Torsdag 25 april, 2013 1:23 Microsoft gör en online-undersökning för att förstå din åsikt på Msdn-webbplatsen. Om du väljer att delta, kommer onlineundersökningen att presenteras för dig när du lämnar Msdn-webbplatsen. Vill du delta 2017 Microsoft. Alla rättigheter förbehållna.

No comments:

Post a Comment