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;

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

img

 WITH CTE AS (
  SELECT
    [序号],
    [股票代码],
    [涨幅],
    [量化值],
    LAG([涨幅]) OVER (ORDER BY [序号]) AS [前一行涨幅]
  FROM [GP_GPDMBCJL]
)
SELECT [序号],[股票代码],[涨幅],[量化值]
FROM CTE
WHERE [涨幅] >= [前一行涨幅] * 1.28 OR [前一行涨幅] IS NULL;


可以使用 lag、lead函数试试看 可以参考下这个http://t.csdn.cn/upmEv

留给后来者解决问题。


 WITH CTE AS (
  SELECT
    [序号],
    [股票代码],
    [涨幅],
    [量化值],
     LAG([涨幅],1,0) OVER (ORDER BY [序号]) AS [前一行涨幅],
     LAG([量化值],1,0) OVER (ORDER BY [序号]) AS [前一行量化值]
  FROM [GP_GPDMBCJL]
)
SELECT [序号],[股票代码],[涨幅],[量化值],
 LAG([涨幅],1,0) OVER (ORDER BY [序号]) AS [前一行涨幅],
     LAG([量化值],1,0) OVER (ORDER BY [序号]) AS [前一行量化值]

FROM CTE
WHERE [涨幅] >= [前一行涨幅] * 0.1 
AND [量化值] >= [前一行量化值] *2  
AND 序号<>'001'
 WITH CTE AS (
  SELECT
    [序号],
    [股票代码],
    [涨幅],
    [量化值],
     LAG([涨幅],1,0) OVER (ORDER BY [序号]) AS [前一行涨幅],
     LAG([量化值],1,0) OVER (ORDER BY [序号]) AS [前一行量化值]
  FROM [GP_GPDMBCJL]
)
SELECT count(*)

FROM CTE
WHERE [涨幅] >= [前一行涨幅] * 1.28
AND [量化值] >= [前一行量化值] *2  
AND 序号<>'001'

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/747953
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:五个简单的 SQL 查询性能测试题,只有 40% 及格率。你敢来挑战吗?
  • 除此之外, 这篇博客: 数据库索引原理及SQL查询优化索引优化中的 大家有没有这样的经历,没有经验的时候,自己写的一个查询,别人却在建立了一个合适的索引后,查询时间竟然缩短了90%? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    既然大家都知道索引能够加快查询速度,然而

    1. 索引究竟是一个什么东东?
    2. 为什么要给表加上主键?
    3. 为什么加索引后会使查询变快?
    4. 为什么加索引后会使写入、修改、删除变慢?
    5. 写SQL时要注意些什么?


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^