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

时间:2014-01-12 17:51:19

标签: mysql sql stored-procedures

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

将此视为填充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

1 个答案:

答案 0 :(得分:1)

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

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

填充:

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)