问题描述
有物品:
-
item_1
- ...
-
item_N
N大约是几百。有时可以添加新项目。
每个项目都有一组参数:
-
parameter_1
- ...
-
parameter_M
parameter_j(item_i)
具有大量的时间-值对:
-
<t0,v0>
(对parameter_j(item_i)的首次测量) - ...
-
<tk,vk>
(对parameter_j(item_i)的最新度量)
需要执行的基本查询:
- 项目参数的所有值(按测量时间排序)
- 所有项目的所有参数的最新值
我需要什么数据库结构(表)来有效地执行这些查询?您能为这两种查询提供SQL代码吗?
解决方法
我可能会采用这样的结构:
我将提供MS SQL代码。
用于创建这些表的示例代码:
IF NOT OBJECT_ID('tempdb..#Items') IS NULL DROP TABLE #Items
CREATE TABLE #Items (
ID int NOT NULL,ItemName varchar(255) NOT NULL,PRIMARY KEY (ID)
)
IF NOT OBJECT_ID('tempdb..#Measurements') IS NULL DROP TABLE #Measurements
CREATE TABLE #Measurements (
ItemID int NOT NULL,MeasurementDate datetime NOT NULL,Param1 varchar(255),Param2 float,Param3 varchar(255),ParamN binary
FOREIGN KEY (ItemID) REFERENCES #Items (ID)
)
我通过以下代码填充了伪数据:
INSERT INTO #Items values ( 0,'Item1' )
INSERT INTO #Items values ( 1,'Item2' )
INSERT INTO #Measurements (ItemID,MeasurementDate,Param2) values (0,GetDate(),2.3)
INSERT INTO #Measurements (ItemID,Param3) values (1,DATEADD(day,3,GetDate()),'red')
INSERT INTO #Measurements (ItemID,2,'blue')
INSERT INTO #Measurements (ItemID,5,4.0)
查询,,某项参数的所有值(按测量时间排序)“:
代码:
SELECT #Measurements.MeasurementDate,#Measurements.Param2
FROM #Measurements INNER JOIN #Items ON #Measurements.ItemID = #Items.ID
WHERE #Items.ItemName LIKE '%Item1%'
ORDER BY #Measurements.MeasurementDate
输出:
查询,所有项目的所有参数的最新值”:
代码(请参见说明SQL Server get latest value by date):
SELECT TOP 1 WITH TIES
*
FROM #Measurements
ORDER BY row_number() over (partition by ItemID order by MeasurementDate desc)
输出: