bri*_*tey 7 sql sql-server optimization query-optimization sql-server-2008-r2
我有两个表,一个用于位置的值,我正在尝试插入位置.表格已简化为以下内容:
CREATE TABLE value(
Timestamp DATETIME2,
Value float NOT NULL,
PRIMARY KEY(Timestamp)
);
CREATE TABLE location(
Timestamp DATETIME2,
Position INT NOT NULL,
PRIMARY KEY(Timestamp)
);
INSERT INTO value VALUES
('2011/12/1 16:55:01', 1),
('2011/12/1 16:55:02', 5),
('2011/12/1 16:55:05', 10),
('2011/12/1 16:55:08', 6);
INSERT INTO location VALUES
('2011/12/1 16:55:00', 0),
('2011/12/1 16:55:05', 10),
('2011/12/1 16:55:10', 5)
Run Code Online (Sandbox Code Playgroud)
预期的结果将是
TimeStamp, Value, LowerTime, LowerLocation, UpperTime, UpperLocation
2011-12-01 16:55:01, 1, 2011-12-01 16:55:00, 0, 2011-12-01 16:55:05, 10
2011-12-01 16:55:02, 5, 2011-12-01 16:55:00, 0, 2011-12-01 16:55:05, 10
2011-12-01 16:55:05, 10, 2011-12-01 16:55:05, 10, 2011-12-01 16:55:05, 10
2011-12-01 16:55:08, 6, 2011-12-01 16:55:05, 10, 2011-12-01 16:55:10, 5
Run Code Online (Sandbox Code Playgroud)
(请记住,这是简化的示例数据,以便了解我尝试执行的查询.)
要进行插值,我需要计算给定值时间之前和之后的时间和位置.我目前正在使用如下查询执行此操作:
SELECT
V.Timestamp,
V.Value,
(SELECT MAX(Timestamp) FROM dbo.location WHERE Timestamp <= V.Timestamp) as LowerTime,
(SELECT TOP 1 Position FROM dbo.location WHERE Timestamp <= V.Timestamp ORDER BY timestamp DESC) as LowerLocation,
(SELECT MIN(Timestamp) FROM dbo.location WHERE Timestamp >= V.Timestamp) as UpperTime,
(SELECT TOP 1 Position FROM dbo.location WHERE Timestamp >= V.Timestamp ORDER BY timestamp ASC) as UpperLocation
FROM
dbo.value V
Run Code Online (Sandbox Code Playgroud)
现在这个有效,但这显然做了很多工作.我认为必须有一个我错过的查询简化,但我整个上午一直在玩它并且没有提出任何具体的东西.希望有人在这里有更好的主意.
我目前正在探索是否有办法找出LowerTime和UpperTime并使用它们来确定位置.就像是:
SELECT
V.Timestamp,
V.Value,
(SELECT MAX(Timestamp) FROM dbo.location WHERE Timestamp <= V.Timestamp) as LowerTime,
(SELECT Position FROM dbo.location WHERE Timestamp = LowerTime) as LowerLocation,
(SELECT MIN(Timestamp) FROM dbo.location WHERE Timestamp >= V.Timestamp) as UpperTime,
(SELECT Position FROM dbo.location WHERE Timestamp = UpperTime) as UpperLocation
FROM
dbo.value V
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
EDIT1:按建议更新了查询.但是执行时间没有明显变化.
EDIT2:添加了我对目前正在尝试的方法的看法.
Ser*_*sev 11
为简单起见,您至少可以使用MAX()和MIN()函数来查询timestamp字段而不是TOP 1和ORDER BY.
完整的查询将是
SELECT
V.Timestamp,
V.Value,
(SELECT MAX(Timestamp) FROM dbo.location WHERE Timestamp <= V.Timestamp) as LowerTime,
(SELECT TOP 1 Position FROM dbo.location WHERE Timestamp <= V.Timestamp ORDER BY timestamp DESC) as LowerLocation,
(SELECT MIN(Timestamp) FROM dbo.location WHERE Timestamp >= V.Timestamp) as UpperTime,
(SELECT TOP 1 Position FROM dbo.location WHERE Timestamp >= V.Timestamp ORDER BY timestamp ASC) as UpperLocation
FROM
dbo.value V
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24491 次 |
| 最近记录: |