将时间序列数据存储在SQL Server中,并动态提取数据

时间:2013-06-28 15:53:31

标签: sql-server tsql database-design

我正在尝试设计一个基于关系的数据库,但同时存储时间序列数据。

例如,我有一个表

CREATE TABLE [dbo].[Fund](
[FundID] [int] NOT NULL,
[FundName] [nvarchar](50) NULL,
[FundCurrency] [nchar](3) NOT NULL,
 CONSTRAINT [PK_Fund] PRIMARY KEY CLUSTERED 
)

我有另一个表存储数据,除了第一列的名称'Dates',所有其他的都是f + fundID,例如F1001。

CREATE TABLE [dbo].[FundData](
[Dates] [datetime] NOT NULL,
[f1001] [float] NULL,
 CONSTRAINT [PK_FundData] PRIMARY KEY CLUSTERED 
)

我不知道这种天真的方式是否有效。由于它将处理的数据不会太多。每日报价,最多10年的每日数据,最多500列。

但我面临的真正问题是如何使用输入FundID和BeginDate以及EndDate创建UDF以返回包含日期的一系列数据。或者如何创建存储过程以返回一个单一报价,给定FundID和日期。

由于UDF不接受动态列名,我真的不知道如何实现这一点。通过重新设计如何存储数据,或通过一些聪明的方式制作UDF。

非常感谢您提前

1 个答案:

答案 0 :(得分:0)

您应该将FundId添加为FundData的外键,为每条记录添加开始日期和结束日期(假设我正确理解了问题)

CREATE TABLE [dbo].[FundData](
[Dates] [datetime] NOT NULL,
[FundId] int NOT NULL,
[Value] [float] NULL,
[BeginDate] [datetime],
[EndDate] [datetime],
 CONSTRAINT [PK_FundData] PRIMARY KEY CLUSTERED,
 CONSTRAINT [FK_FundData_Fund] FOREIGN KEY FundId REFERENCES Fund(FundId)
)

然后,您可以执行以下操作:@FundId, @BeginDate@EndDate是所有T-SQL变量或存储过程参数

SELECT Value
FROM FundData
WHERE FundID = @FundId
AND BeginDate >= @BeginDate
AND EndDate <= @EndDate