2

I have 3 tables.

Table 1 has 2 fields : Time/Value

Table 2 has 2 fields : Time/Value

Table 3 has 1 field : Time

I want to find, for each Time in Table 3, the Value in Table 1 and Table 2 which is the closest to the Time field.

Time precision in Table1 and 2 is around millisecond. Time precision in Table3 is 1 second.

Is it possible to do so in a SQL query without having to parse the tables with a loop myself?

4

2 に答える 2

4

これは SQL で行うことができますが、SQL で使用できるツールが原因で遅くなります。Table3 の各行に対して、Table1 と Table2 のすべての行を探す必要があります。より用途の広い言語でソリューションを手作業でコーディングすると、問題のドメインを最適化できます。アドホック リクエストとしてのみ実行する場合は、SQL をコーディングするのが最も簡単で、次のようになります。

SELECT t3.time,
  (SELECT TOP 1 t1.value
   FROM t1
   ORDER BY ABS(DATEDIFF(ms,t3.time,t1.time)) ASC
  ) as t1value,
  (SELECT TOP 1 t2.value
   FROM t2
   ORDER BY ABS(DATEDIFF(ms,t3.time,t2.time)) ASC
  ) as t2value
FROM t3

これがどのように機能するか

t3 の各行について、時間差で並べ替えられた t1 と t2 の両方で選択を行い、最小のもののみを取得します。

速度についての注意

このコードは で実行されO(N3 * N1) + O(N3 * N2)ます。優れたアルゴリズムを手作業でコーディングすると、O(N3 * log(N1)) + O(N3 * log(N2). (時間内に高速で最も近い検索を実行できるため)。

于 2013-06-15T17:06:50.917 に答える