sql >> Database >  >> RDS >> Sqlserver

Multipilcatie-aggregatie in Sql-server

Ik zou de scalaire functie niet gebruiken voor dit type bewerking. U krijgt slechte prestaties omdat de query-optimizer het row-by-row moet uitvoeren zonder enige optimalisatie. Meer info:SQL Server Functions: The Basics .

Tweede met float/decimaal en LOG/EXP u krijgt benaderingsfouten.

Ten derde om gegevens door te geven aan de functie kunt u XML . gebruiken zoals:

CREATE FUNCTION dbo.udf_Mul(@value xml)
RETURNS FLOAT
AS
  BEGIN
      DECLARE @mul_value FLOAT;
      DECLARE @values AS TABLE ([value] float);

       INSERT INTO @values([value])
       SELECT [value] = t.c.value('(value)[1]', 'float')
      FROM @value.nodes('//row') AS t(c);


      SELECT @mul_value=CASE
               WHEN MinVal = 0 THEN 0
               WHEN Neg % 2 = 1 THEN -1 * Exp(ABSMult)
               ELSE Exp(ABSMult)
             END 
      FROM   (SELECT
             Sum(Log(Abs(NULLIF(Value, 0)))) AS ABSMult,
             Sum(Sign(CASE
                        WHEN Value < 0 THEN 1
                        ELSE 0
                      END))                  AS Neg,
             Min(Abs(Value))                 AS MinVal
              FROM   @values) foo

      RETURN @mul_value
  END 

en het noemen:

SELECT *
FROM Floats a
CROSS APPLY (SELECT dbo.udf_mul((SELECT [value]
                                 FROM Floats b
                                 WHERE a.id >= b.id
                                 FOR XML PATH, ROOT('root')))
             AS r) as cs(r);

SqlFiddleDemo

Uitgang:

╔═════╦════════╦════════════════════╗
║ id  ║ value  ║         r          ║
╠═════╬════════╬════════════════════╣
║  1  ║     1  ║ 1                  ║
║  2  ║     3  ║ 3.0000000000000004 ║
║  3  ║     6  ║ 17.999999999999996 ║
║  4  ║     2  ║ 36                 ║
╚═════╩════════╩════════════════════╝



  1. Hoe het pad van mysql-services te veranderen

  2. databaseontwerp voor quiz met verschillende talen

  3. Hoe u de huidige datum en tijd kunt krijgen met tijdzoneverschuiving in PostgreSQL

  4. Een databasemodel ontwerpen voor een bioscoopreserveringssysteem