sql >> Databasteknik >  >> RDS >> Sqlserver

Rekursivt förfallande medelvärde i SQL Server 2012

Ett möjligt alternativ skulle vara

WITH T AS
(
SELECT      
 Value * POWER(5E-1, ROW_NUMBER() 
                     OVER (ORDER BY Row DESC)
               /* first row decays less so special cased */
              -IIF(LEAD(Value) OVER (ORDER BY Row DESC) IS NULL,1,0))
       as x
FROM Sample
)
SELECT SUM(x)
FROM T

SQL Fiddle

Eller för den uppdaterade frågan med 60%/40%

WITH T AS
(
SELECT   IIF(LEAD(Value) OVER (ORDER BY Row DESC) IS NULL,  1,0.6)
         * Value 
         * POWER(4E-1, ROW_NUMBER() OVER (ORDER BY Row DESC) -1)
       as x
FROM Sample
)
SELECT SUM(x)
FROM T

SQL-fiol

båda ovanstående utför en enda passage genom data och kan potentiellt använda ett index på Row INCLUDE(Value) för att undvika en sorts.




  1. fråga mysql-databas inifrån en klass

  2. Hur skapar man en vy med 14 000 kolumner?

  3. sparar base64-data - problem med radstorleken är för stor

  4. Hitta det vanligaste värdet i SQL-kolumnen