sql >> データベース >  >> RDS >> Sqlserver

SqlサーバーでのMultpilcation集計

    このタイプの操作にはスカラー関数を使用しません。クエリ オプティマイザーは row-by-row に実行する必要があるため、パフォーマンスが低下します。 最適化なしで。詳細:SQL Server Functions: The Basics .

    float/decimal および LOG/EXP の秒 近似誤差が発生します。

    3番目に XML を使用して関数にデータを渡します いいね:

    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 
     

    そしてそれを呼び出します:

    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

    出力:

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


    1. PostgreSQLで監視する重要事項-ワークロードの分析

    2. PostgreSQLのデュアルからの同等性

    3. MySQLのselectクエリで正規表現を書く方法は?

    4. sqlalchemyで返すことで生のクエリを実行する方法