繁体   English   中英

随着时间的流逝选择越来越少的记录?

[英]Select less and less records over time?

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

您可以将其想象为填充Google财经股票图表:过去几天的所有价格变动都适合当日,而您回头走得越远,每个日期显示的价格变动就越少。 今天所有的价格变动都将显示,一个星期前的价格变动将显示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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM