如何解决SQL关联矩阵
我在 MS SQL Server 中有一个数据表,如下所示
date time strategy PL
20150505 1135 402016 -53
20150507 1410 291821 -31
20150520 1535 251209 -17
20150619 940 281316 49
20160302 1020 471105 -7
20160421 1515 221908 -9
20190520 1145 150711 -10
20171229 1100 252111 0
20180424 1355 401720 -10
20180516 1005 312913 15
20180605 1145 220711 -5
20181019 1450 250724 18
20190211 1050 282710 -19
20160425 1100 451105 22
20160816 1110 421116 -8
20160915 1505 383106 -21
20171114 1355 453922 16
20171116 930 422805 -7
20171129 1010 463216 -4
20160801 1345 141208 -7
20160912 935 211814 91
20170627 1310 470714 -8
20170803 1615 381024 0
20170825 1310 431012 -1
20171114 1020 383614 -14
20190523 1000 262409 3
20190815 940 431616 -6
20191230 1035 291607 -2
20200221 1555 483216 -9
20171124 1625 301613 8
20180824 1305 402124 -19
20181003 1410 402725 11
20181016 1135 220907 23
20190102 1020 463422 -8
20190118 935 463610 12
20150511 1105 382023 -41
20151218 950 481012 -15
20160708 1500 321518 20
20160712 1550 341712 -6
20161024 1110 100825 -36
20170308 1050 462413 0
20180808 1300 423611 -16
20180904 1115 381120 3
20190906 1500 380817 -9
20191205 1425 341509 -5
20200103 930 491222 -16
20150223 1430 211014 -18
20151027 1350 451711 23
我想在时间1的所有策略和时间2的所有策略之间创建一个相关系数矩阵,如下所示(水平轴为time1,垂直轴为time2)
402016 402017 402018 402019 ... ... ...
402016 0.1 0.3 0.7 0.5
402017 0.4 0.7 0.9 0.432
402018 0.22 -0.2 -0.477 -0.56
402019 -0.5 -0.7 0.6 0.8
'''
解决方法
这是我的代码。由于表格太大,无法使用数据透视表。我将结果插入表格
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fnGetCorrelation1]') )
DROP FUNCTION [dbo].[fnGetCorrelation1]
GO
CREATE FUNCTION [dbo].[fnGetCorrelation1]
(
@Strategy1 VARCHAR(10),@Strategy2 VARCHAR(10),@Time1 VARCHAR(10),@Time2 VARCHAR(10)
)
RETURNS FLOAT
AS
BEGIN
DECLARE @Corr FLOAT
SELECT
@Corr = (AVG(([Strategy1])*([Strategy2])))/(STDEVP([Strategy1])*STDEVP([Strategy2]))
FROM
(SELECT [Date],isnull([Stratgy1],0) as [Strategy1],isnull([Stratgy2],0) as [Strategy2] FROM
(SELECT
[Date],CASE WHEN [Strategy] + [time] * 1000000 = @Strategy1 + @time1 * 1000000 THEN 'Stratgy1' ELSE 'Stratgy2'END AS [Strategy],[PL]
FROM [**].[dbo].[grouppedResult]
WHERE ([time] = @time1 or [time] = @time2) AND ([Strategy] = @Strategy1 OR [Strategy] = @Strategy2)) as SourceTable
PIVOT
(SUM([PL]) FOR [Strategy] in ( [Stratgy1],[Stratgy2])) as PivotTable
) Datatable
RETURN(@Corr)
END
GO
/*############################################################*/
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[uspGetCorrMatrix]') AND type in (N'P',N'PC'))
DROP PROCEDURE [dbo].[uspGetCorrMatrix]
GO
CREATE PROC [dbo].[uspGetCorrMatrix]
@time1 INT,@time2 INT
AS
BEGIN
DECLARE @Sql NVARCHAR(MAX)
DECLARE @ColumnsText NVARCHAR(MAX)
DECLARE @StrategyList TABLE (Strategy INT)
INSERT INTO @StrategyList SELECT [strategy] FROM [**].[dbo].[grouppedResult] WHERE [time] = @time1 or [time] = @time2 GROUP BY [strategy] ORDER BY [strategy]
/*SELECT * FROM @StrategyList*/
SELECT @ColumnsText = COALESCE(@ColumnsText + ',','') + QUOTENAME([strategy]) FROM @StrategyList AS Columns ORDER BY Columns.[strategy]
INSERT INTO [**].[dbo].[correlation] select [Strategy1] = a.[strategy],[Strategy2] = b.[strategy],[Time1] = @time1,[Time2] = @time2,[Corr] = dbo.fnGetCorrelation1(a.[strategy],b.[strategy],CONVERT(varchar(4),@time1),@time2))
from @StrategyList a CROSS JOIN @StrategyList b
END
GO
EXEC [dbo].[uspGetCorrMatrix] '930','935'
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。