Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Agregat mnożenia w SQL Server

Nie użyłbym funkcji skalarnej do tego typu operacji. Skutkuje to słabą wydajnością, ponieważ optymalizator zapytań musi go uruchomić row-by-row bez optymalizacji. Więcej informacji:SQL Server Functions: The Basics .

Drugi z liczbami zmiennoprzecinkowymi/dziesiętnymi i LOG/EXP otrzymasz błędy aproksymacji.

Po trzecie, aby przekazać dane do funkcji, możesz użyć XML jak:

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 

i nazywając 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

Wyjście:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server INFORMATION_SCHEMA Widoki | Sprawdź, czy stół istnieje

  2. C# Wstaw do tabeli SQL z listą jako parametrem

  3. Zapytanie SQL, aby wybrać ciąg między dwoma znanymi ciągami

  4. Jak ustawić automatyczne zatwierdzanie w sesji SQL Server?

  5. Przypadki użycia instrukcji MERGE programu SQL Server:synchronizowanie tabel online i historii