Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 随着时间的推移,选择的记录越来越少?_Mysql_Sql_Stored Procedures - Fatal编程技术网

Mysql 随着时间的推移,选择的记录越来越少?

Mysql 随着时间的推移,选择的记录越来越少?,mysql,sql,stored-procedures,Mysql,Sql,Stored Procedures,我想编写一个查询或存储过程,随着时间的推移,从关系数据库中检索的记录越来越少 想象一下,就像填充谷歌金融股票图表一样:过去几天所有的刻度都与当天相符,你越往回走,每个日期显示的刻度就越少。所有蜱虫都会在今天显示,50%的蜱虫会在一周前显示,30%的蜱虫会在一个月前显示,10%的蜱虫会在一年前显示。把它想象成一个梯度 是否可以通过一个查询来实现这一点?或者可能需要使用多个查询?这看起来像什么 请注意,记录ID是非连续的(存在间隙),但每个记录都有一个时间戳用于确定顺序 还要注意,我使用的是MySQ

我想编写一个查询或存储过程,随着时间的推移,从关系数据库中检索的记录越来越少

想象一下,就像填充谷歌金融股票图表一样:过去几天所有的刻度都与当天相符,你越往回走,每个日期显示的刻度就越少。所有蜱虫都会在今天显示,50%的蜱虫会在一周前显示,30%的蜱虫会在一个月前显示,10%的蜱虫会在一年前显示。把它想象成一个梯度

是否可以通过一个查询来实现这一点?或者可能需要使用多个查询?这看起来像什么

请注意,记录ID是非连续的(存在间隙),但每个记录都有一个时间戳用于确定顺序

还要注意,我使用的是MySQL

以下是我的表格结构:

quotes
    id
    security_id
    last_price
    bid_price
    ask_price
    date
    timestamp
    trade_volume
    cumulative_volume
    average_volume
    created_at

听起来您正在寻找一组表示时间跨度的常量记录。您可以通过定义控制日期集来实现这一点

下面是一个示例查询(不考虑周末和节假日,但可以添加):

填充:

CREATE TABLE #quotes
(
    id int identity(1,1)
    ,security_id VARCHAR(50)
    ,last_price FLOAT
    ,bid_price FLOAT
    ,ask_price FLOAT
    ,[date] DATETIME
    ,[timestamp] DATETIME
    ,trade_volume FLOAT
    ,cumulative_volume FLOAT
    ,average_volume FLOAT
    ,created_at DATETIME
)
DECLARE @i int 
set @i = 100000
WHILE @i > 0 
BEGIN

INSERT INTO #quotes (
    security_id
    ,last_price 
    ,bid_price 
    ,ask_price 
    ,[date] 
    ,[timestamp]
    ,trade_volume 
    ,cumulative_volume
    ,average_volume 
    ,created_at

)
values( 'IBM US'
    , 100.00 + RAND()
    , 100.00 + RAND()
    , 100.00 + RAND()
    , DATEADD(MINUTE, -1* @i, GETDATE())
    , DATEADD(MINUTE, -1* @i, GETDATE())
    , 10000000.00 + RAND()*1000000.00
    , 10000000.00 + RAND()*1000000.00
    , 10000000.00 + RAND()*1000000.00
    ,getdate())

set @i= @i-1
END
您可以围绕时间跨度进行更改,但下面将提供1000条左右的记录,这些记录从开始到结束表示集合

DECLARE @StartDate DATETIME, 
    @EndDate DATETIME,
    @j FLOAT,
    @step FLOAT
set @StartDate = GETDATE()-20
SET @EndDAte = GETDATE()
set @j = 0.0

CREATE TABLE #TimeTable 
(
    IntervalDate DATETIME
)
--say you always want 1000 measures
--use the datediff value to define the step size:
select @step = DATEDIFF(MINUTE, @StartDate, @EndDate)/1000.0

WHILE @j < DATEDIFF(MINUTE, @StartDate, @EndDate)
BEGIN 
    INSERT #TimeTable (IntervalDate) VALUES (DATEADD(minute, @j, @StartDate))
    SET @j = @j+@step
    print @j
END


select security_id
    ,last_price 
    ,bid_price 
    ,ask_price 
    ,[date] 
    ,[timestamp]
    ,trade_volume 
    ,cumulative_volume
    ,average_volume 
    ,created_at 
from #Quotes q
    join #TimeTable t on dateadd(mi, datediff(mi, 0, q.date), 0) = dateadd(mi, datediff(mi, 0, t.IntervalDate), 0)
DECLARE@StartDate DATETIME,
@EndDate日期时间,
@j浮动,
@阶跃浮子
设置@StartDate=GETDATE()-20
SET@EndDAte=GETDATE()
设置@j=0.0
创建表#时间表
(
间隔日期时间
)
--假设你总是想要1000个度量
--使用datediff值定义步长:
选择@step=DATEDIFF(分钟、@StartDate、@EndDate)/1000.0
而@j
一个表格结构和数据的例子会很好。否则你可能只会得到一些建议。用结构更新问题。