Sql server )这是不支持或记录,也不能保证工作(现在或将来)。正如我在我的答案中发布的,小心使用这种方法。默认情况下,SUM()OVER()使用RANGE UNBOUNDED preference,它使用磁盘假脱机。随着源数据越来越大,您将真正看到这对磁盘假脱机的影响

Sql server )这是不支持或记录,也不能保证工作(现在或将来)。正如我在我的答案中发布的,小心使用这种方法。默认情况下,SUM()OVER()使用RANGE UNBOUNDED preference,它使用磁盘假脱机。随着源数据越来越大,您将真正看到这对磁盘假脱机的影响,sql-server,tsql,cumulative-sum,Sql Server,Tsql,Cumulative Sum,)这是不支持或记录,也不能保证工作(现在或将来)。正如我在我的答案中发布的,小心使用这种方法。默认情况下,SUM()OVER()使用RANGE UNBOUNDED preference,它使用磁盘假脱机。随着源数据越来越大,您将真正看到这对磁盘假脱机的影响。如果您使用前面的行无界它将发生在内存中,直到达到非常高端…这里如何使用where子句并获得原始结果的运行总数?谢谢!只是想提一下,在递归cte中,如果您的amt是十进制的,那么x.rt+y.amt必须转换为十进制,否则它会抛出“类型在锚点和递


)这是不支持或记录,也不能保证工作(现在或将来)。正如我在我的答案中发布的,小心使用这种方法。默认情况下,
SUM()OVER()
使用
RANGE UNBOUNDED preference
,它使用磁盘假脱机。随着源数据越来越大,您将真正看到这对磁盘假脱机的影响。如果您使用前面的
行无界
它将发生在内存中,直到达到非常高端…这里如何使用where子句并获得原始结果的运行总数?谢谢!只是想提一下,在递归cte中,如果您的amt是十进制的,那么x.rt+y.amt必须转换为十进制,否则它会抛出“类型在锚点和递归部分之间不匹配”@Jack0fshad0ws谢谢,一定要记住,但答案是基于这个问题的,它有
amt int
@AaronBertrand我不完全理解奇怪的更新方法的问题,我想知道它是否能满足我的需求而不必担心。我必须在用户有积分的地方进行抽奖,每个积分都是一次机会。我没有任何订单。用户A得10分,用户B得25分,用户Z得15分。所以我的累积机会可能是A 10,B 25 35,Z 15 50。如果订单发生变化,比如B2525,Z1540,A1050,我可以毫无错误地抽奖1到50之间的随机数。我使用古怪的更新安全吗?@Horaciux我不知道为什么你需要古怪的更新。但我现在没有能力确定你是否安全。。。你需要测试一下it@AaronBertrand无论如何,谢谢你。我提出一个完整的问题。
create table Transactions(Tid int,amt int)
insert into Transactions values(1, 100)
insert into Transactions values(2, -50)
insert into Transactions values(3, 100)
insert into Transactions values(4, -100)
insert into Transactions values(5, 200)
TID  amt  balance
--- ----- -------
1    100   100
2    -50    50
3    100   150
4   -100    50
5    200   250
select *, sum(amt) over (order by Tid) as running_total from Transactions 
select *,(select sum(amt) from Transactions where Tid<=t.Tid) as running_total from Transactions as t
SELECT t1.TID, t1.amt, RunningTotal = SUM(t2.amt)
FROM dbo.Transactions AS t1
INNER JOIN dbo.Transactions AS t2
  ON t1.TID >= t2.TID
GROUP BY t1.TID, t1.amt
ORDER BY t1.TID;
SELECT TID, amt, RunningTotal = amt + COALESCE(
(
  SELECT SUM(amt)
    FROM dbo.Transactions AS i
    WHERE i.TID < o.TID), 0
)
FROM dbo.Transactions AS o
ORDER BY TID;
DECLARE @t TABLE
(
  TID INT PRIMARY KEY,
  amt INT,
  RunningTotal INT
);
 
DECLARE @RunningTotal INT = 0;
 
INSERT @t(TID, amt, RunningTotal)
  SELECT TID, amt, RunningTotal = 0
  FROM dbo.Transactions
  ORDER BY TID;
 
UPDATE @t
  SET @RunningTotal = RunningTotal = @RunningTotal + amt
  FROM @t;
 
SELECT TID, amt, RunningTotal
  FROM @t
  ORDER BY TID;
;WITH x AS
(
  SELECT TID, amt, RunningTotal = amt
    FROM dbo.Transactions
    WHERE TID = 1
  UNION ALL
  SELECT y.TID, y.amt, x.RunningTotal + y.amt
   FROM x 
   INNER JOIN dbo.Transactions AS y
   ON y.TID = x.TID + 1
)
SELECT TID, amt, RunningTotal
  FROM x
  ORDER BY TID
  OPTION (MAXRECURSION 10000);
;WITH y AS 
(
  SELECT TID, amt, rn = ROW_NUMBER() OVER (ORDER BY TID)
    FROM dbo.Transactions
), x AS
(
    SELECT TID, rn, amt, rt = amt
      FROM y
      WHERE rn = 1
    UNION ALL
    SELECT y.TID, y.rn, y.amt, x.rt + y.amt
      FROM x INNER JOIN y
      ON y.rn = x.rn + 1
)
SELECT TID, amt, RunningTotal = rt
  FROM x
  ORDER BY x.rn
  OPTION (MAXRECURSION 10000);
CREATE TABLE #x
(
  rn  INT PRIMARY KEY,
  TID INT,
  amt INT
);

INSERT INTO #x (rn, TID, amt)
SELECT ROW_NUMBER() OVER (ORDER BY TID),
  TID, amt
FROM dbo.Transactions;

;WITH x AS
(
  SELECT TID, rn, amt, rt = amt
    FROM #x
    WHERE rn = 1
  UNION ALL
  SELECT y.TID, y.rn, y.amt, x.rt + y.amt
    FROM x INNER JOIN #x AS y
    ON y.rn = x.rn + 1
)
SELECT TID, amt, RunningTotal = rt
  FROM x
  ORDER BY TID
  OPTION (MAXRECURSION 10000);

DROP TABLE #x;
CREATE TABLE #x
(
  TID INT PRIMARY KEY, 
  amt INT, 
  rt INT
);

INSERT #x(TID, amt) 
  SELECT TID, amt
  FROM dbo.Transactions
  ORDER BY TID;

DECLARE @rt INT, @tid INT, @amt INT;
SET @rt = 0;

DECLARE c CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY
  FOR SELECT TID, amt FROM #x ORDER BY TID;

OPEN c;

FETCH c INTO @tid, @amt;

WHILE @@FETCH_STATUS = 0
BEGIN
  SET @rt = @rt + @amt;
  UPDATE #x SET rt = @rt WHERE TID = @tid;
  FETCH c INTO @tid, @amt;
END

CLOSE c; DEALLOCATE c;

SELECT TID, amt, RunningTotal = rt 
  FROM #x 
  ORDER BY TID;

DROP TABLE #x;
SELECT TID, amt, 
  RunningTotal = SUM(amt) OVER (ORDER BY TID ROWS UNBOUNDED PRECEDING)
FROM dbo.Transactions
ORDER BY TID;
SELECT TID, amt, 
  RunningTotal = SUM(amt) OVER (ORDER BY TID)
FROM dbo.Transactions
ORDER BY TID;

SELECT TID, amt, 
  RunningTotal = SUM(amt) OVER (ORDER BY TID RANGE UNBOUNDED PRECEDING)
FROM dbo.Transactions
ORDER BY TID;
SELECT  T1.* ,
        T2.RunningSum
FROM    dbo.Transactions As T1
        CROSS APPLY ( SELECT    SUM(amt) AS RunningSum
                      FROM      dbo.Transactions AS CAT1
                      WHERE     ( CAT1.TId <= T1.TId )
                    ) AS T2
SELECT  * ,
        SUM(T1.amt) OVER ( ORDER BY T1.TId 
                        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS RunningTotal
FROM    dbo.Transactions AS t1
DECLARE @RunningBalance int = 0
SELECT Tid, Amt, 0 AS RunningBalance
INTO #TxnTable
FROM Transactions
ORDER BY Tid

UPDATE #TxnTable
SET @RunningBalance = RunningBalance = @RunningBalance + Amt

SELECT * FROM #TxnTable
DROP TABLE #TxnTable
select v.ID
,CONVERT(VARCHAR(10), v.EntryDate, 103) + ' '  + convert(VARCHAR(8), v.EntryDate, 14) 
as EntryDate
,case
when v.CreditAmount<0
then
    ISNULL(v.CreditAmount,0) 
    else 
    0 
End  as credit
,case
when v.CreditAmount>0
then
    v.CreditAmount
    else
    0
End  as debit
,Balance = SUM(v.CreditAmount) OVER (ORDER BY v.ID ROWS UNBOUNDED PRECEDING)
      from VendorCredit v
    order by v.EntryDate desc
SELECT date, sum(count(DISTINCT unique_id)) OVER (ORDER BY date) AS total_per_date
FROM dbo.table
GROUP BY date