Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Агрегат за мултипилиране в Sql сървър

Не бих използвал скаларна функция за този тип операция. В крайна сметка получавате лоша производителност, защото оптимизаторът на заявки трябва да го изпълнява ред по ред без никаква оптимизация. Повече информация: Функции на SQL Server:Основите .

Второ с float/decimal и LOG/EXP ще получите грешки в приближението.

Трето, за предаване на данни към функция можете да използвате XML като:

CREATE FUNCTION dbo.udf_Mul(@value xml)ВРЪЩА FLOATAS BEGIN DECLARE @mul_value FLOAT; DECLARE @values ​​AS TABLE ([стойност] float); INSERT INTO @values([стойност]) SELECT [стойност] =t.c.value('(стойност)[1]', 'float') FROM @value.nodes('//ред') 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  

и го извиква:

SELECT *FROM Floats aCROSS APPLY (SELECT dbo.udf_mul((SELECT [стойност] FROM Floats b WHERE a.id>=b.id FOR XML PATH, ROOT('root'))) AS r) като cs(r); 

SqlFiddleDemo

Изход:

<предварителен код>╔═════╦════════╦═════════════════════╗║ id ║ стойност ╠═════╬════════╬════════════════════╣║ 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. Грешка - препълване на SqlDateTime. Трябва да е между 1/1/1753 00:00:00 AM и 12/31/9999 23:59:59 PM

  2. Зависимост от работата на SQL Server Agent

  3. Брент Озар обяснява вътрешната и външната фрагментация на SQL Server

  4. Форматиране на число със запетаи, но без десетични знаци в SQL Server 2008 R2?

  5. Драйверът Go with SQL Server не може да се свърже успешно, неуспешно влизане