我需要求得一个值,后一个值致少比前一个值大28%就是0.28,符合条件的就找出来,现在主要的问题是算法效率太慢,每天要产生几十万条数据,有没有高效一点的算法,计算出来?
下面是表结构和表的值。
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.28,002涨幅是不是比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做特殊处理,实现思路如下
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'
不知道你这个问题是否已经解决, 如果还没有解决的话:既然大家都知道索引能够加快查询速度,然而