billrolbin 2023-06-09 14:21 采纳率: 80.8%
浏览 37
已结题

SQL SERVER 股票量化运算一个简单示例程序

我需要求得一个值,后一个值致少比前一个值大28%就是0.28,符合条件的就找出来,现在主要的问题是算法效率太慢,每天要产生几十万条数据,有没有高效一点的算法,计算出来?

img

下面是表结构和表的值。

if exists (select * from sysobjects where id = OBJECT_ID('[GP_GPDMBCJL]') and OBJECTPROPERTY(id, 'IsUserTable') = 1) 
DROP TABLE [GP_GPDMBCJL]

CREATE TABLE [GP_GPDMBCJL] (
[序号] [char]  (3) NOT NULL,
[股票代码] [char]  (8) NULL,
[涨幅] [decimal]  (18,2) NULL,
[量化值] [decimal]  (18,2) NULL)

ALTER TABLE [GP_GPDMBCJL] WITH NOCHECK ADD  CONSTRAINT [PK_GP_GPDMBCJL] PRIMARY KEY  NONCLUSTERED ( [序号] )
INSERT [GP_GPDMBCJL] ([序号],[股票代码],[涨幅],[量化值]) VALUES ( N'001',N'sz000686',1.39,0.23)
INSERT [GP_GPDMBCJL] ([序号],[股票代码],[涨幅],[量化值]) VALUES ( N'002',N'sz000686',1.53,1.02)
INSERT [GP_GPDMBCJL] ([序号],[股票代码],[涨幅],[量化值]) VALUES ( N'003',N'sz000686',2.78,2.18)
INSERT [GP_GPDMBCJL] ([序号],[股票代码],[涨幅],[量化值]) VALUES ( N'004',N'sz000686',2.36,3.25)
INSERT [GP_GPDMBCJL] ([序号],[股票代码],[涨幅],[量化值]) VALUES ( N'005',N'sz000686',2.08,3.93)

下面是我们想实现的简单算法,但这样效率太低,主要问题是有没有更高效的算法计算?

       Declare  @k                int
        Declare  @V_001          decimal(18,2)
        Declare  @V_002          decimal(18,2)
        Declare  @V_003          decimal(18,2)
        Declare  @V_004          decimal(18,2)
        Declare  @V_005          decimal(18,2)
        Declare  @V_006          decimal(18,2)
        Declare  @V_007          decimal(18,2)
        Declare  @V_008          decimal(18,2)


    Select @V_001=涨幅   from GP_GPDMBCJL where  序号='001' and 股票代码='sz000686' 
    Select @V_002=涨幅   from GP_GPDMBCJL where  序号='002' and 股票代码='sz000686' 
    Select @V_003=涨幅   from GP_GPDMBCJL where  序号='003' and 股票代码='sz000686' 
    set @k=0;   //如何在003时,找出003涨幅是不是比002涨幅大0.28002涨幅是不是比001的涨幅大0.28

    set @V_004=@V_001*1.28
    set @V_005=@V_002*1.28
    set @V_006=@V_003*1.28

    if(@V_004<@V_002)
    begin
    if(@V_005<@V_003)
        begin
              set @k=1;
        end;
    end;

    print @k;

  • 写回答

4条回答 默认 最新

  • 喝茶品人生 2023-06-09 14:46
    关注

    001因为用了窗口函数得跟他上一层比,这里没有对001做特殊处理,实现思路如下

    img

     WITH CTE AS (
      SELECT
        [序号],
        [股票代码],
        [涨幅],
        [量化值],
        LAG([涨幅]) OVER (ORDER BY [序号]) AS [前一行涨幅]
      FROM [GP_GPDMBCJL]
    )
    SELECT [序号],[股票代码],[涨幅],[量化值]
    FROM CTE
    WHERE [涨幅] >= [前一行涨幅] * 1.28 OR [前一行涨幅] IS NULL;
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月18日
  • 已采纳回答 6月10日
  • 创建了问题 6月9日

悬赏问题

  • ¥15 odoo17中,产品分包路线如何设置?可从销售订单中直接触发采购订单及相关单据
  • ¥30 vite打包部署后,遇到Failed to load module script
  • ¥15 请教下win10wx和麒麟wx无法互通俩者数据并不兼吗,如何解决?(标签-linux)
  • ¥15 永劫无间游戏如何实现微加速 或者说游戏优化(玩家)
  • ¥15 knx的软件sdk库
  • ¥15 用VBA将文件夹内的所有表格自动复制到一个表格的sheet1内,
  • ¥15 帮找书和配套代码。。
  • ¥15 使用深度优先搜索所有可能路径
  • ¥20 Ant Design of Vue 的表格使用,根据当前代码,实现以下功能
  • ¥15 C#中模版应用的问题