2016-10-04 10 views
2

私は(x、y)値のSQLテーブルを持っています。SQL関数テーブル補間

x  y 
0.0 0.0 
0.1 0.4 
0.5 1.0 
5.0 2.0 
6.0 4.0 
8.0 4.0 
10.0 5.0 

xカラムはインデックスされています。私はsqliteを使用しています。

私の究極の目標は、任意のx値に対してy(x)を得ることです。私はテーブル値を使って線形補間を使います。以下のプロットに示すようになります。

enter image description here

直接選択クエリを使用して線形補間を実行する方法はありますか? それ以外の場合は、xが属する区間の値を取得するだけで十分です。

補間されたy(x)の値を計算できるように、指定されたxの最後の小さい方のペアと最初の大きなペアを返すクエリがありますか?例えば

x=2.0を取得する場合:

0.5 1.0 
5.0 2.0 

ケースでは、二つのX最初/最後の値は外挿を実行するために取得するためにテーブルの外にあります。例えば

x=20.0が取得する場合:

8.0 4.0 
10.0 5.0 
+0

あなたの質問は何ですか?どのようにy値を得るか、または補間する方法は?可能であれば、@ CL、 –

+0

@ CLなど。補間が不可能な場合は、2つのペアを取得するだけで十分です。 – ztik

+0

@ CL質問を編集してより明確にしました。 – ztik

答えて

2

分析機能せず、平野SQLLiteでこれを行うには難しいだろう。より複雑なSQLエンジンでは、簡単に十分な数のペアを取得するために、LEG and LEAD分析関数を使用できます。 SQLLiteで しかし、私はそれらのような2つのカーソル、作成します。

カーソルC1:

SELECT 
    x,y 
FROM 
    table 
WHERE 
    x>=2 
ORDER BY 
    x asc 
; 

カーソルC2:

SELECT 
    x,y 
FROM 
    table 
WHERE 
    x<=2 
ORDER BY 
    x desc 
; 

そして、他の言語での操作の残りの部分を実行する - から一度フェッチをどちらか一方のカーソルが値を返さない場合は、他方の値から2回の値を返します。また、いくつかの追加の例外を処理する必要があります。つまり、セットの値が2つ未満の場合はどうでしょうか。あるいは、あなたがあなたのセットにXを与えた場合 - 補間はまったく必要ありません。

+0

ありがとう、私はこれを1つ選択したいと思います。これは可能ですか? – ztik

+0

@ztikなぜですか?どのような問題が解決するのでしょうか? –

+0

私はまた、この要件のポイント(または簡単な解決策)も見ません。 Xでインデックスが作成されている場合、これらのカーソルからのフェッチはすばやく行う必要があります。 –

1

私は単純な減算を使用します。

あなたはので、2つの最も近い入力に探しています:しかし、これは全表スキャンにつながる

SELECT x, y 
FROM my_table 
ORDER BY Abs(:val - x) 
LIMIT 2 

+0

いい考え。しかし、彼はまだ補間や外挿であるべきかどうかをチェックし、何かを何かする必要があるかどうかをチェックするために、アプリでロジックを必要とします。また、テーブル全体のスキャンは、パフォーマンスの点では良いとは言えません。 ;)しかし、それはcertailnyシンプルで美しい解決策です! –

+0

テーブルスキャンはそれ自体問題ではありません。可能なリソースに対してテーブルが「大きい」場合は問題になる可能性があります。今私達はテーブルの正確な構造を知りません。また、フルスキャンを行わないか、または – Nemeros

+1

になっていない別の選択カラム(graph_idなど)がある場合、私はこの解決策を考えました。私の主な関心事は、常に正しい間隔を与えないということです。例えば ​​'x = 0.6'なら0.1と0.5の行が得られます – ztik