如何 运行 多个对象在一段时间内的标量函数
How to run a scalar function over a length of time for multiple objects
您好,我正在尝试使用标量值函数对大量数据进行算术计算。我的源数据采用以下格式:
----------
ID PriceDate Type Value
1 14/01/2018 Alpha 1.05
1 14/01/2018 Beta 1.07
2 14/01/2018 Alpha 1.03
2 14/01/2018 Beta 1.2
3 14/01/2018 Alpha 1.6
3 14/01/2018 Beta 1.5
1 15/01/2018 Alpha 1.24
1 15/01/2018 Beta 1.23
2 15/01/2018 Alpha 1.29
2 15/01/2018 Beta 1.1
3 15/01/2018 Alpha 1.16
3 15/01/2018 Beta 1.4
完整的数据集有超过 700 万行(1900 个唯一 ID 和从现在到 2011 年的日期)。
还有一种情况是数据集不完整,ID 在特定日期可能有 alpha 值但没有 beta 值,反之亦然或根本没有。
我正在尝试为 ID 同时具有 alpha 值和 beta 值的每个单独日期计算 (alpha-beta)/beta。
到目前为止,我有一个函数可以为特定值执行此操作:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION instrument.Calculate (@PriceDateF datetime, @ID bigint)
RETURNS decimal(20,10)
AS
-- Returns ((Alpha-Beta)/Beta)
BEGIN
Declare @BetaT decimal(20,10)
Declare @AlphaT decimal(20,10)
Declare @Result decimal (20,10)
SELECT @BetaT = Value
FROM ValueTable I
WHERE I.PriceDate = @PriceDateF
AND I.ID = @ID
AND Type = 'Beta'
SELECT @AlphaT = Value
FROM ValueTable I
WHERE I.PriceDate = @PriceDateF
AND I.ID = @ID
AND Type = 'Alpha'
SELECT @Result = (@AlphaT - @BetaT)/@BetaT
RETURN @Result
END
GO
我的问题是,我如何在 'Value table' 上 运行 随着时间的推移为每个单独的 ID 使用此函数以获得每个 ID 每天的结果 (a-b)/b。我不确定我如何输入参数以及该函数是否应该循环遍历数据 table 或任何其他方式来做到这一点。我也不确定如何处理数据中的差距(某些日期没有值,或者只有 beta 或 alpha 值)。
非常感谢:)
我正在使用 SQL Server Management Studio 2014
在您的情况下,join
可能足够简单:
select da.pricedate, da.id, da.value as alpha, db.value as beta,
(da.value - db.value) / db.value
from data da join
data db
on da.pricedate = db.pricedate and da.id = db.id and
da.type = 'Alpha' and
db.type = 'Beta';
不需要用户自定义函数。
请注意,您也可以使用聚合来执行此操作:
select id, pricedate,
max(case when type = 'Alpha' then value end) as Alpha,
max(case when type = 'Beta' then value end) as Beta,
(max(case when type = 'Alpha' then value end) -
max(case when type = 'Beta' then value end)
) / max(case when type = 'Beta' then value end) as calculation
from data
group by id, pricedate;
再次说明,用户定义的函数在这里没有用。
您好,我正在尝试使用标量值函数对大量数据进行算术计算。我的源数据采用以下格式:
----------
ID PriceDate Type Value
1 14/01/2018 Alpha 1.05
1 14/01/2018 Beta 1.07
2 14/01/2018 Alpha 1.03
2 14/01/2018 Beta 1.2
3 14/01/2018 Alpha 1.6
3 14/01/2018 Beta 1.5
1 15/01/2018 Alpha 1.24
1 15/01/2018 Beta 1.23
2 15/01/2018 Alpha 1.29
2 15/01/2018 Beta 1.1
3 15/01/2018 Alpha 1.16
3 15/01/2018 Beta 1.4
完整的数据集有超过 700 万行(1900 个唯一 ID 和从现在到 2011 年的日期)。 还有一种情况是数据集不完整,ID 在特定日期可能有 alpha 值但没有 beta 值,反之亦然或根本没有。
我正在尝试为 ID 同时具有 alpha 值和 beta 值的每个单独日期计算 (alpha-beta)/beta。
到目前为止,我有一个函数可以为特定值执行此操作:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION instrument.Calculate (@PriceDateF datetime, @ID bigint)
RETURNS decimal(20,10)
AS
-- Returns ((Alpha-Beta)/Beta)
BEGIN
Declare @BetaT decimal(20,10)
Declare @AlphaT decimal(20,10)
Declare @Result decimal (20,10)
SELECT @BetaT = Value
FROM ValueTable I
WHERE I.PriceDate = @PriceDateF
AND I.ID = @ID
AND Type = 'Beta'
SELECT @AlphaT = Value
FROM ValueTable I
WHERE I.PriceDate = @PriceDateF
AND I.ID = @ID
AND Type = 'Alpha'
SELECT @Result = (@AlphaT - @BetaT)/@BetaT
RETURN @Result
END
GO
我的问题是,我如何在 'Value table' 上 运行 随着时间的推移为每个单独的 ID 使用此函数以获得每个 ID 每天的结果 (a-b)/b。我不确定我如何输入参数以及该函数是否应该循环遍历数据 table 或任何其他方式来做到这一点。我也不确定如何处理数据中的差距(某些日期没有值,或者只有 beta 或 alpha 值)。
非常感谢:) 我正在使用 SQL Server Management Studio 2014
在您的情况下,join
可能足够简单:
select da.pricedate, da.id, da.value as alpha, db.value as beta,
(da.value - db.value) / db.value
from data da join
data db
on da.pricedate = db.pricedate and da.id = db.id and
da.type = 'Alpha' and
db.type = 'Beta';
不需要用户自定义函数。
请注意,您也可以使用聚合来执行此操作:
select id, pricedate,
max(case when type = 'Alpha' then value end) as Alpha,
max(case when type = 'Beta' then value end) as Beta,
(max(case when type = 'Alpha' then value end) -
max(case when type = 'Beta' then value end)
) / max(case when type = 'Beta' then value end) as calculation
from data
group by id, pricedate;
再次说明,用户定义的函数在这里没有用。