Comment puis-je sélectionner la valeur la plus proche inférieur à et supérieur à une valeur donnée de manière efficace?

J'ai deux tables, une pour les valeurs de l'un pour l'emplacement et suis en train d'interpoler emplacement. Les tables ont été simplifiées à l'suivantes:

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)

Les résultats attendus serait

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

(Gardez à l'esprit que c'est simplifiée des données de l'échantillon pour avoir une idée de la question je suis en train de se produire partout.)

De faire de l'interpolation, j'ai besoin de comprendre le temps et les lieux avant et après les valeurs de temps. Je suis actuellement en train de le faire avec une requête qui ressemble à:

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 

Maintenant cela fonctionne, mais, évidemment, est de faire beaucoup de travail. Je pense il doit y avoir une requête de simplification que je suis absente, mais j'ai joué avec elle tous les matins et je n'ai pas trouver quelque chose de concret. En espérant que quelqu'un ici a une meilleure idée.

Je suis actuellement en train d'étudier s'il existe un moyen de comprendre le LowerTime et UpperTime et les utiliser dans la détermination de l'emplacement. Quelque chose comme:

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 

mais cela ne fonctionne pas.

EDIT1: mise à Jour de la requête, comme l'a suggéré. Toutefois, aucun changement visible au moment de l'exécution.

EDIT2: Ajout de mes pensées de l'approche, je suis en train d'essayer.

OriginalL'auteur brianestey | 2012-01-20