0

SQL/Mysqlの結合操作に対応する質問があります。

私のデータベーステーブル構造には次のフィールドがあります

タイムスタンプ

ラットダブル

ロンダブル

実際のデータはこんな感じ

| | 2013-07-20 16:32:22 | 49.3 | 8.3 |

| | 2013-07-20 16:17:09 | 49.2 | 8.2 |

| | 2013-07-20 15:58:19 | 49.1 | 8.1 |

ここで、このテーブルをそれ自体と結合して、1 つのデータセットが次に低いタイムスタンプを持つデータセットと結合するようにします。そのため、これら 2 つの違いは最小限に抑えられます。

したがって、最終的に私の結果は

| | 2013-07-20 16:32:22 | 49.3 | 8.3 | 2013-07-20 16:17:09 | 49.2 | 8.2 |

| | 2013-07-20 16:17:09 | 49.2 | 8.2 | 2013-07-20 15:58:19 | 49.1 | 8.1 |

そこにたどり着くために、次のSQLステートメントを試しました

SELECT * FROM positionp1 , positionp2 WHERE p1.time > p2.time GROUP BY p1.time;

しかし、結果はまさに私が意図したものではありませんでした.2番目の(グループ化された)部分は、このソリューションによって「正しく」ソートされていません。次のようになります。

| | 2013-07-20 16:32:22 | 49.3 | 8.3 | 2013-07-20 15:58:19 | 49.1 | 8.1 |

| | 2013-07-20 16:17:09 | 49.2 | 8.2 | 2013-07-20 15:58:19 | 49.1 | 8.1 |

SQL を使用して意図した結果が得られるかどうかを誰かに教えてもらえますか?

4

2 に答える 2

1

これは確かに可能です。残念ながら、MySQL にはこれを簡単にする機能がありません。

行をランク付けしてから、ランクで結合します。

select 
  p1.time as time1,
  p1.lat as lat1,
  p1.lon as lon1,
  p1.rank as rank1,
  p2.time as time2,
  p2.lat as lat2,
  p2.lon as lon2,
  p2.rank as rank2
from (
  select position.*,
    @curRank1 := @curRank1 + 1 AS rank 
  from position , (SELECT @curRank1 := 0) r 
  order by time desc) p1
join (
  select position.*,
    @curRank2 := @curRank2 + 1 AS rank 
  from position , (SELECT @curRank2 := 0) r 
  order by time desc) p2
on p1.rank = p2.rank -1

これが実際の動作を示すフィドルです: http://sqlfiddle.com/#!2/d777f/8

于 2013-07-20T16:51:27.000 に答える