2

フィールドを持つMySQLテーブルについて考えてみますdatetime。次の値または前の値の間にある行を選択したいと思いdatetimeます。たとえば、次の値のレコードが存在する場合:

1   2012-10-17 12:00
2   2012-10-16 12:00
3   2012-10-14 12:00
4   2012-10-08 12:00
5   2012-10-03 12:00
6   2012-10-01 12:00

したがって、最も「分離された」レコードは、最も近いレコードから5日離れているため、レコード#4です。

「最も孤立した」タイがある場合とない場合があることに注意してください。この場合、タイイング行のいずれか、またはすべてが返される可能性があります。また、この例では、値が順番に並べられたレコードが示されてdatetimeいますが、実際のデータセットでは必ずしもそうではない場合があります。

4

2 に答える 2

3

テーブルが foo (id, time) のように定義されている場合、次の SQL を使用できます。

SELECT t1.id FROM foo t2
   INNER JOIN foo t1 ON t1.id=t2.id+1
   INNER JOIN foo t3 ON t3.id=t1.id+1
  WHERE timestampdiff(day,t1.time,t2.time)+timestampdiff(day,t3.time,t1.time)=
    (SELECT max(timestampdiff(day,t1.time,t2.time)+timestampdiff(day,t3.time,t1.time))
         FROM foo t2 INNER JOIN foo t1 ON t1.id=t2.id+1 
                     INNER JOIN foo t3 ON t3.id=t1.id+1)

「最も孤立した」エントリをすべて取得します。エントリが 1 つだけ必要な場合は、いつでもlimit 1.
また、ここでは、エントリがタイムスタンプ順に並べられていると想定していることにも注意してください。エントリが時間順に並べられていない場合は、それらを並べ替えるビューを作成できます。

sqlfiddle

于 2012-10-17T23:42:12.043 に答える
1

これを使用して、最も近いレコードまでの距離を決定できます。

SELECT foo.d, TIMESTAMPDIFF(DAY, max(earlier.d), d) as previous, TIMESTAMPDIFF(DAY, d, min(later.d)) as next
FROM foo
LEFT JOIN foo later ON foo.d < later.d
LEFT JOIN foo earlier ON foo.d > earlier.d
GROUP BY foo.d

これらの値の最も遠いものをかなり簡単に取得できます。

于 2012-10-17T22:48:21.387 に答える