【问题标题】:How to find Running Multiplication如何找到运行乘法
【发布时间】:2015-02-09 20:49:03
【问题描述】:

不确定这是不是正确的标题。我需要找到cumulative multiplication,就像运行总数一样。

搜索了论坛,得到了一个很好的answer。但这不是我的确切答案。

所以修改了我的要求的答案。

SELECT *,
       (SELECT CASE
                 WHEN Min(Abs(Column1)) = 0 THEN 0
                 ELSE Exp(Sum(Log(Abs(NULLIF(Column1, 0))))) -- the base mathematics
                      * Round(0.5 - Count(NULLIF(Sign(Sign(Column1) + 0.5), 1))%2, 0) -- pairs up negatives
               END
        FROM   TEMP a
        WHERE  B.ID >= A.ID) as  Running_Mul
FROM   TEMP B 

我得到了答案。现在Sql Server 2008 有没有更好的方法来做到这一点?

样本数据:

ID  Column1 
--  -------
1   1       
2   2       
3   4       
4   8       
5   -2  

预期结果:

ID  Column1 Running_Mul
--  ------- -----------
1   1       1
2   2       2
3   4       8
4   8       64
5   -2      -128

Sql Fiddle

【问题讨论】:

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

你的方法很合理。顺便说一下,sum() 中的 nullif() 很好。虽然else 子句 仅在then 之后计算的,但else 的组件是在聚合期间计算的——因此log(0) 会返回错误。

我觉得有一些比较简单的计算符号的方法,比如:

power(-1, sum(case when column1 < 0 then 1 else 0 end))

或:

(case when sum(case when column1 < 0 then 1 else 0 end) % 2 = 0 then 1 else -1 end)

但是,哪个版本“更简单”是一个见仁见智的问题。

【讨论】:

  • 可以在我的查询失败时分享一个示例。我没听懂你想说的对不起。
  • @NoDisplayName 。 . .你的版本不会失败。对不起,我没有说清楚这一点。在case 语句中需要nullif() 是一个微妙的问题,尽管文档说这些子句是按顺序评估的。
【解决方案2】:

这是我在我的 SP 中使用的另一种方法:

USE DB
GO

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO

IF(OBJECT_ID('TEMP') IS NOT NULL)
DROP TABLE TEMP

CREATE TABLE TEMP (ID INT, Column1 INT)
INSERT INTO TEMP VALUES
(1,1), 
(2,2), 
(3,4), 
(4,8), 
(5,-2)  

DECLARE @result TABLE(ID INT, Column1 INT, calc INT)
DECLARE @Calc INT = 1

INSERT INTO @result (ID,Column1)
SELECT ID,Column1 FROM TEMP ORDER BY ID

UPDATE @result SET @Calc = calc = Column1 * @Calc

SELECT * FROM @result

我发现了一个博客,其中比较了解决此类问题的不同方法。检查here

【讨论】:

  • 谢谢你的时间老兄:)
  • 在那个链接中提到了 注意:使用“更新到局部变量”方法有一个很大的假设。这是 Update 语句将以正确的顺序更新临时表中的行。没有简单的方法来指定 Update 语句的顺序,所以这个方法可能会失败,尽管我还没有看到这实际上发生了!
  • 是的!确实如此。如果不知何故更新没有按正确的顺序进行,它不会给出预期的结果,但我还没有看到这种情况。这是类似的问题和答案,其中陈述相同:stackoverflow.com/questions/11310877/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2021-05-09
  • 1970-01-01
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
相关资源
最近更新 更多