如何按ID分组将表数据传入自定义表值参数函数聚合?
解决方案:按ID分组调用自定义表类型参数的XIRR函数
要实现按ID分组,将每组的Date和Value构造为自定义表类型XIRRTable传入[RE].[XIRR]函数,核心是为每个ID单独生成表类型实例并传递给函数。以下是可行的实现方式:
实现代码
假设你的源表名为YourSourceTable,可以使用CROSS APPLY配合表类型变量来处理每个分组:
SELECT t.ID, x.XIRRResult AS XIRR FROM ( -- 获取所有唯一ID,避免重复处理 SELECT DISTINCT ID FROM YourSourceTable ) t CROSS APPLY ( -- 为当前ID创建并填充XIRRTable类型变量 DECLARE @cashFlows [RE].[XIRRTable] INSERT INTO @cashFlows (Date, Value) SELECT Date, Value FROM YourSourceTable st WHERE st.ID = t.ID -- 调用XIRR函数并返回结果 SELECT [RE].[XIRR](@cashFlows) AS XIRRResult ) x
原理说明
- 首先通过
SELECT DISTINCT ID获取所有需要处理的分组ID,避免重复处理同一ID的行。 - 在
CROSS APPLY的子查询中,为每个ID单独创建XIRRTable类型的变量@cashFlows,并插入该ID对应的所有Date和Value数据。 - 最后将填充好的表类型变量传入
[RE].[XIRR]函数,得到该分组的XIRR结果。
示例验证
源表示例(InvestmentReturns)
| ID | Date | Value |
|---|---|---|
| 1 | 2020-01-01 | -10000 |
| 1 | 2020-06-30 | 3000 |
| 1 | 2021-01-01 | 8000 |
| 2 | 2020-02-01 | -5000 |
| 2 | 2020-12-31 | 5500 |
期望输出
| ID | XIRR |
|---|---|
| 1 | 0.0955 |
| 2 | 0.1165 |
将源表名替换为InvestmentReturns运行上述代码,即可得到符合预期的聚合结果。
性能优化建议
如果源表数据量较大,建议在ID字段上创建非聚集索引,或者创建包含Date和Value的覆盖索引,加快子查询中数据插入的速度:
CREATE NONCLUSTERED INDEX IX_YourSourceTable_ID_Date_Value ON YourSourceTable (ID) INCLUDE (Date, Value);
内容的提问来源于stack exchange,提问作者MongooseC
相关产品推荐
相关产品推荐

