我正在尝试设计一个基于关系的数据库,但同时存储时间序列数据。
例如,我有一个表
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。
非常感谢您提前
答案 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