0

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

例如,我有一张桌子

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 列。

但我面临的真正问题是如何创建一个 UDF 来返回一系列带日期的数据,输入 FundID 和 BeginDate 和 EndDate。或者如何创建一个存储过程来返回一个单引号,给定 FundID 和 Date。

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

非常感谢您提前

4

1 回答 1

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)
)

然后您可以执行以下操作 where@FundId, @BeginDate@EndDateare all T-SQL 变量或存储过程参数

SELECT Value
FROM FundData
WHERE FundID = @FundId
AND BeginDate >= @BeginDate
AND EndDate <= @EndDate
于 2013-06-28T17:14:33.440 回答