我正在WindowsNT6.3 (Build 9600:) (Hypervisor)上运行MicrosoftSQLServer2012-11.0.5058.0 (X64)标准版(64位)。我们正在以1Hz的速度将传感器数据输入到这个数据库。每个测试都有不同数量的传感器,可以是任何类型的。通道名称(ChName)将向用户描述他们是什么。
用户将从网络界面中选择TestID和他们想要的ChName。
我有一个表,它是这样设置的,但是包含大约1500万行和大约50个TestID:
Timestamp datetime,TestID int,ChName varchar(100),Value real
Timestamp | TestID | ChName | Value
13:52:12 | 1000 | A | 23
13:52:12 | 1000 | B | 2
13:52:12 | 1000 | C | 150
13:52:13 | 1000 | A | 25
13:52:13 | 1000 | C | 147
13:52:13 | 1000 | B | 1
13:52:14 | 1000 | A | 24
13:52:14 | 1000 | B | 4
13:52:14 | 1000 | C | 151
13:52:15 | 1000 | B | 8
13:52:15 | 1000 | C | 153
13:52:16 | 1000 | B | 3
13:52:16 | 1000 | C | 149
13:52:17 | 1000 | C | 152
13:52:17 | 1000 | A | 27我正在寻找一个查询,在搜索一个特定的TestID和特定的ChName时,它将返回一个逗号分隔的结果,并以NULL的顺序搜索未找到的结果。
例如,搜索TestID 1000和ChNames ('A','B','C')将返回:
Timestamp | Data
13:52:12 | 23,2,150
13:52:13 | 25,1,147
13:52:14 | 24,4,151
13:52:15 | NULL,8,153
13:52:16 | NULL,3,149
13:52:17 | 27,NULL,152搜索TestID 1000和ChNames ('B','C')将返回:
Timestamp | Data
13:52:12 | 2,150
13:52:13 | 1,147
13:52:14 | 4,151
13:52:15 | 8,153
13:52:16 | 3,149
13:52:17 | NULL,152我已经在PHP中实现了这一点,返回了包含TestID和ChName的所有行,但速度很慢(返回503,000行,在PHP中进行分组大约需要2分钟)。我确实相信表的结构会更好,但不幸的是,我继承了这个设计,因此试图获得更高效的查询。
这些数据的目的是提取它并导出到excel,或者用户可以通过一个webapp来绘制它。用户有能力选择所有数据或某一时间段。
请求所有数据时的查询如下所示,然后在PHP中对其进行分组,如果未找到,则添加NULL。
SELECT Timestamp,ChName,Value FROM data_table WHERE TestID=1000 AND ChName IN ('A','B',C') ORDER BY Timestamp,ChName发布于 2016-04-21 21:04:54
我建议使用PIVOT并根据您希望为ChName生成的结果的值列表动态构建查询:
SELECT TimeStamp,
COALESCE([A], 'NULL') + ',' +
COALESCE([B], 'NULL') + ',' +
COALESCE([C], 'NULL') AS Data
FROM
( SELECT TimeStamp, ChName, Value
FROM data_table
WHERE TestID = 1000
AND ChName IN ('A',B',C')
) AS SourceTable
PIVOT
(
Max(Value)
FOR ChName IN ([A], [B], [C])
) AS PivotTable;我还没有测试这个,所以它可能有一些语法问题。
https://stackoverflow.com/questions/36778139
复制相似问题