一つ

2011-11-15 5 views
2

MS SQL:一つ

表ワン:二--tableはルート:を停止しますが

(停止のシーケンス、キーフィールドのIDを取得するために、int型のフィールド[配列]を使用します)

[routes]を[stops]テーブルに参加させ、最初と最後のルートだけを1行に戻すにはどうすればよいですか?

のは、私は単純結合んとしましょう:私はそれを返すようにしたい

Route 1 | Stop 1 
Route 1 | Stop 2 
Route 1 | Stop 3 
Route 2 | Stop 1 
Route 2 | Stop 2 

Route 1 | Stop 1 | Stop 3 
Route 2 | Stop 1 | Stop 2 

私はそれらを結合するとMin(配列)とMax(配列)を得ることができますが、私がどのようにIDを取得でき、Seqは取得できないのか分かりません。これは2つの結合を行いたいのとほぼ同じですが、複数のフィールドがあります。ある時間に何千ものルートを返すので効率的である必要があります。だから私は、テーブルを取得する関数は、ストップを得るために有益だろうとは思わない。しかし、最小と最大のseqを取得して関連するストップIDを返すことができれば、Stopsに関連するデータを取得するためにStopsに単純に参加できます。

+0

テーブルスキーマとサンプルデータを投稿できますか?単純なGROUP BYが必要なようですが、わかりません。 –

答えて

4
;WITH S 
    AS (SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY RouteId ORDER BY seq) AS RN1, 
       ROW_NUMBER() OVER (PARTITION BY RouteId ORDER BY seq DESC) AS RN2 
     FROM Stops) 
SELECT R.Route, 
     S1.Stop, 
     S2.Stop 
FROM Routes R 
     JOIN S S1 
     ON R.Id = S1.RouteId 
     JOIN S S2 
     ON R.Id = S2.RouteId 
WHERE S1.RN1 = 1 
     AND S2.RN2 = 1 
+0

うわー...それは素晴らしいです。私は効率をまだテストしていませんが、それは魅力のように機能しました。一番上のスクリプトの機能についてもっと調べる必要があります。これまでにいくつかのものを使っていましたが、その知識をつかむ時期を知るには十分ではありませんでした! –

+0

@ MichaelC.Gates - このタイプのクエリの一般的な名前は「グループごとに最大」または「グループごとに上位n」です。効率性については、[この記事](http://www.sqlmag.com/article/departments/optimizing-top-n-per-group-queries)を参照してください。 –