SQL Common Table 表达式内外的分区数据

SQL Partition data within and outside of a Common Table Expression

我正在使用 SQL Server 2012 我有以下示例结果集。带有 Tot 前缀的列派生自左侧的列。

我想要做的是针对给定日期和给定 AssetStyle 对数据进行分区。基于这个标准,我想计算利润和 ACB 的总和。然后我想将这两个总和的结果相除得到总 return 个数。示例数据如下。

ValuationDate   CustodianaccountNum AssetStyle  AssetClass  Profit  ACB NetReturn   TotProfit   TotACB  TotReturn
3/31/2007   1111    All Cap US All Cap  2552.55337  1069804.43  0.002386    719511.4487 7859959.87  0.091541364
3/31/2007   2222    All Cap US All Cap  1085.121285 1547961.89  0.000701    719511.4487 7859959.87  0.091541364
3/31/2007   3333    All Cap US All Cap  715873.774  3298000 0.217063    719511.4487 7859959.87  0.091541364
3/31/2007   4444    All Cap US All Cap  0   1944193.55  0   719511.4487 7859959.87  0.091541364
4/30/2007   1111    All Cap US All Cap  1374.387675 554859.78   0.002477    404343.9809 5803741.618 0.069669535
4/30/2007   2222    All Cap US All Cap  8041.548001 1038959.69  0.00774 404343.9809 5803741.618 0.069669535
4/30/2007   3333    All Cap US All Cap  -714.739726 554922.1475 -0.001288   404343.9809 5803741.618 0.069669535
4/30/2007   4444    All Cap US All Cap  395642.785  3655000 0.108247    404343.9809 5803741.618 0.069669535
3/31/2008   1111    Alt. Investment Strategies  Alternative Investments -6701.16054 1445773.579 -0.004635   -46461.95138    2709953.979 -0.017144923
3/31/2008   2222    Alt. Investment Strategies  Alternative Investments -2859.33957 37854.99999 -0.075534   -46461.95138    2709953.979 -0.017144923
3/31/2008   3333    Alt. Investment Strategies  Alternative Investments 0   247481.1    0   -46461.95138    2709953.979 -0.017144923
3/31/2008   4444    Alt. Investment Strategies  Alternative Investments -36901.45127    978844.3    -0.037699   -46461.95138    2709953.979 -0.017144923

我正在尝试根据以下查询获得此结果。

WITH DATA AS
(
SELECT 
  ValuationDate, 
  CustodianaccountNum,
  AssetStyle, 
  AssetClass, 
  Profit, 
  ACB, 
  NetReturn, 
  SUM(Profit) OVER  (PARTITION by  AssetStyle, ValuationDate) AS TotProfit,
  SUM(ACB) OVER  (PARTITION by  AssetStyle, ValuationDate) AS TotACB
FROM 
  [PWM_Performance].[dbo].[BucketPerformance2]
)
SELECT 
  *, 
  SUM(TotProfit/TotACB) OVER  (PARTITION by  AssetStyle, ValuationDate) AS TotReturn
FROM data
  WHERE Totacb > 1
  ORDER BY AssetStyle, ValuationDate

我得到了 TotProfit 和 totACB 的预期结果,但是我没有得到 TotReturn 的正确结果。样本数据显示了正确的结果,但我得到的值不是我在分区语句中指示的数据子集的总和。

我正在使用 CTE,因为我认为我无法从前面两个导出的利润和 ACB 中得出计算结果。

我想你正在寻找:

SUM(TotProfit) OVER  (PARTITION by  AssetStyle, ValuationDate) / 
    SUM(TotACB) OVER  (PARTITION by  AssetStyle, ValuationDate)

也就是说,分别对分子和分母求和,然后除以这些和。

WITH DATA AS
(
SELECT 
  ValuationDate, 
  CustodianaccountNum,
  AssetStyle, 
  AssetClass, 
  Profit, 
  ACB, 
  NetReturn, 
  SUM(Profit) OVER (PARTITION BY  AssetStyle, ValuationDate) AS TotProfit,
  SUM(ACB) OVER (PARTITION BY  AssetStyle, ValuationDate) AS TotACB
FROM PWM_Performance.dbo.BucketPerformance2
)
SELECT 
  *, 
  TotProfit / TotACB AS TotReturn
FROM data
WHERE TotACB > 1
ORDER BY AssetStyle, ValuationDate

您已经掌握了正确的分子和分母。 style 和 date 中的分区各有四行,它们都具有相同的值。因此,当您第二次对相同的分区求和时,它只是一遍又一遍地添加相同的比率:为了完成计算,您只需要除法即可。如果您没有过滤 TotACB,您可能已经消除了 CTE。

另一个答案在代数方面有效,但它做了额外的工作。举个例子,它不是直接吐出 1/2,而是要算出 (1+1+1+1) / (2+2+2+2)。性能最终可能是一个因素,鉴于浮点的性质,结果肯定存在一些差异。