我想编写一个查询或存储过程,以便从关系数据库中随时间检索越来越少的记录。
将此视为填充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
答案 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)