sql >> Databáze >  >> RDS >> Sqlserver

Multpilcation Aggregate na SQL Server

Skalární funkci bych pro tento typ operace nepoužil. Skončíte se slabým výkonem, protože optimalizátor dotazů jej musí spouštět row-by-row bez jakékoli optimalizace. Další informace:SQL Server Functions: The Basics .

Druhý s plovoucí/desetinnou soustavou a LOG/EXP dostanete aproximační chyby.

Za třetí k předání dat do funkce můžete použít XML jako:

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 

a nazvat to:

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

Výstup:

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



  1. Postgresql regexp_matches inside view vždy vrátí hodnotu null, když je dotazován z PHP

  2. Ovlivňuje pořadí sloupců v příkazu select rychlost dotazu?

  3. MySQL:Sloupec 'název_sloupce' v místě, kde je klauzule nejednoznačná

  4. Složený OR SQL dotaz (dotaz #1 s WITH) a (dotaz #2) s COUNT() výmluvami