0

我试图获得一个组内的运行总数,但我当前的代码只是给了我一个总和。例如,我的数据看起来像这样

  ID      ShiftNum   Status  Type      Rate      HourlyWage       Hours    Total_Amount     
 12542       1        Full    A         1           12.5            40        500
 12542       1        Full    A         1           12.5            35        420
 12542       2        Full    A         1            10             40        400
 12542       2        Full    B         1.2          10             40        480
 17842       1        Full    A         1            11             27        297
 17842       1        Full    B         1.3          11             30        429

我想要的是同一 ID、班次号和状态内的运行总计。例如,我想要这样的东西作为我的最终结果

  ID      ShiftNum   Status  Type      Rate      HourlyWage       Hours    Total_Amount   Running_Tot  
 12542       1        Full    A         1           12.5            40        500            500
 12542       1        Full    A         1           12.5            35        420            920
 12542       2        Full    A         1            10             40        400            400
 12542       2        Full    B         1.2          10             40        480            880
 17842       1        Full    A         1            11             27        297            297
 17842       1        Full    B         1.3          11             30        429            726

但是,我当前的代码只是给了我每个组内的总和。例如,第 1 行和第 2 行的 920、920。这是我的代码。

Select a.*, 
      SUM(Hours) OVER (PARTITION BY ID, ShiftNum, Status ORDER BY ID, ShiftNum, Status) as Runnint_Tot
from table a

如何修复我的代码以获得我想要的最终结果?

4

1 回答 1

0

您需要一个唯一定义每一行的排序列。你的行中没有一个明显的,但像这样:

SUM(Hours) OVER (PARTITION BY ID, ShiftNum, Status ORDER BY hours) as Running_Tot

或者:

SUM(Hours) OVER (PARTITION BY ID, ShiftNum, Status
                 ORDER BY (SELECT NULL)
                 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
                ) as Running_Tot

你面临的问题是因为ORDER BY钥匙有联系。默认窗口框架是RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW. 注意RANGE. 这意味着所有有关系的行都被合并了。

PARTITION BY另请注意,在其中包含键没有实用程序ORDER BY(嗯......如果您不关心排序,SQL Server 中有一个例外,那么包含一个键可能是一种方便的捷径)。排序发生分区内。

如果您的行可以完全重复,我首先建议您添加一个主键。但是,与此同时,您可以使用:

with a as (
      select a.*,
             row_number() over (order by id, shiftnum, status) as seqnum
      from tablea a
     )
Select a.*, 
      SUM(Hours) OVER (PARTITION BY ID, ShiftNum, Status ORDER BY seqnum) as Running_Tot
from a;

排序将是任意的,但至少会累积。

于 2020-12-01T12:26:36.880 回答