Effectuer une interpolation sur une table, en groupant par un 3ème champ

J'ai une table SQL Server 2008+ avec trois colonnes:

Delta (float) Rate (float) and Date (datetime) 

Je dois être capable de générer une table de taux pour tous les delta pour une date donnée, en interpolant si nécessaire. Je peux le faire très bien pour les valeurs uniques de Delta, mais le faire pour tous Delta en même time me bouscule.

Quelques exemples de données

 Rate ForwardDate Delta 1.3528 2013-09-30 00:00:00.000 -0.9 1.3528 2013-09-30 00:00:00.000 -0.75 1.3528 2013-09-30 00:00:00.000 -0.5 1.3528 2013-09-30 00:00:00.000 -0.25 1.3528 2013-09-30 00:00:00.000 -0.1 7.121 2013-10-30 00:00:00.000 -0.9 7.152 2013-10-30 00:00:00.000 -0.75 7.387 2013-10-30 00:00:00.000 -0.5 7.972 2013-10-30 00:00:00.000 -0.25 8.564 2013-10-30 00:00:00.000 -0.1 6.972 2013-12-30 00:00:00.000 -0.9 7.035 2013-12-30 00:00:00.000 -0.75 7.405 2013-12-30 00:00:00.000 -0.5 8.275 2013-12-30 00:00:00.000 -0.25 9.187 2013-12-30 00:00:00.000 -0.1 7.185 2014-03-30 00:00:00.000 -0.9 7.321 2014-03-30 00:00:00.000 -0.75 7.82 2014-03-30 00:00:00.000 -0.5 8.919 2014-03-30 00:00:00.000 -0.25 10.075 2014-03-30 00:00:00.000 -0.1 7.755 2014-09-30 00:00:00.000 -0.9 7.92 2014-09-30 00:00:00.000 -0.75 8.485 2014-09-30 00:00:00.000 -0.5 9.76 2014-09-30 00:00:00.000 -0.25 11.175 2014-09-30 00:00:00.000 -0.1 

Le meilleur que j'ai trouvé jusqu'ici est:

 ( SELECT Delta, ( DATEDIFF(d, @PreviousDate, @ForwardDate) * NextRate + DATEDIFF(d, @ForwardDate, @NextDate) * PreviousRate ) / DATEDIFF(d, @PreviousDate, @NextDate) AS Rate FROM (SELECT Main.Delta AS Delta, PR.Rate AS PreviousRate, NR.Rate AS NextRate FROM @RatesTable Main INNER JOIN @RatesTable PR on PR.Delta = Main.Delta AND PR.ForwardDate = @PreviousDate INNER JOIN @RatesTable NR on NR.Delta = Main.Delta AND NR.ForwardDate = @NextDate) AS PrevNextRateTable); 

@NextDate et @PreviousDate proviennent d'un calcul antérieur pour déterminer les dates dans la table la plus proche de la date du test ( @ForwardDate ). Ceci est nécessaire, car nous devons nous assurer que toutes les interpolations sont entre les deux mêmes dates (donnant NULL si une valeur est manquante sur l'une des dates). Je ne veux pas interpoler entre différentes dates pour chaque valeur de delta.

Cela me donne ce qui semble être une jointure croisée des résultats

 Delta Rate -0.9 7.742609 -0.75 7.906979 -0.5 8.470543 -0.25 9.741717 -0.1 11.15109 -0.9 7.742609 -0.75 7.906979 -0.5 8.470543 -0.25 9.741717 -0.1 11.15109 -0.9 7.742609 -0.75 7.906979 -0.5 8.470543 -0.25 9.741717 -0.1 11.15109 -0.9 7.742609 -0.75 7.906979 -0.5 8.470543 -0.25 9.741717 -0.1 11.15109 -0.9 7.742609 -0.75 7.906979 -0.5 8.470543 -0.25 9.741717 -0.1 11.15109 

avec 5 résultats pour chaque delta. Je peux sélectionner SELECT DISTINCT si nécessaire, mais je ne peux m'empêcher de penser que c'est de la sortingche et que je fais quelque chose de mal. Existe-t-il un meilleur moyen qui élimine le besoin de SELECT DISTINCT ?

Essaye ça:

 SELECT Delta, ( DATEDIFF(d, @PreviousDate, @ForwardDate) * NextRate + DATEDIFF(d, @ForwardDate, @NextDate) * PreviousRate ) / DATEDIFF(d, @PreviousDate, @NextDate) AS Rate FROM (SELECT Main.Delta AS Delta, PR.Rate AS PreviousRate, NR.Rate AS NextRate FROM @RatesTable Main INNER JOIN @RatesTable PR on PR.Delta = Main.Delta AND PR.ForwardDate = @PreviousDate INNER JOIN @RatesTable NR on NR.Delta = Main.Delta AND NR.ForwardDate = @NextDate) AS PrevNextRateTable GROUP BY Delta, ( DATEDIFF (d, @PreviousDate, @ForwardDate) * NextRate + DATEDIFF(d, @ForwardDate, @NextDate) * PreviousRate ) / DATEDIFF(d, @PreviousDate, @NextDate) ;