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)。性能最终可能是一个因素,鉴于浮点的性质,结果肯定存在一些差异。
我正在使用 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)。性能最终可能是一个因素,鉴于浮点的性质,结果肯定存在一些差异。