SQL关联矩阵

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-