0

テーブルの列で連続したペアを取得する方法を見つけるのに苦労していますが、これまでのところ失敗しています。より具体的に説明するために、例を挙げましょう。

次のように、char の 1 列 (col1) を持つテーブル (t1) があるとします。

col1
------
a
a
a
c
e
a
g
i

私が取得したいのは、 のような連続したペアです (a,a) (a,a) (a,c) (c,e) (e,a) (a g) (g,i)。たとえば、次のように文字列の列 (col2) を持つ新しいテーブル (t2) を作成します。

col2
------
a,a
a,a
a,c
c,e
e,a
a,g
g,i

(同じ値のペアを除外できれば(例:(a、a))、それがより良いでしょう)

lag() のような分析関数がなく、pl/sql を使用できないと仮定してください。基本的なSQLステートメントでこの問題を解決する必要があります。

次のように、この種の問題を解決するための非常に単純なSQLクエリがあります。

select t1.col as col1, min(t2.col) as col2
from table1 t1 inner join table1 t2 on t2.col > t1.col
group by t1.col
order by t1.col

ただし、重複がないと仮定すると、このクエリは機能します。

助けてください。コメントやアイデアは非常にありがたいです。

4

1 に答える 1

1

ROW_NUMBER を使用してこれを実現できます。

SELECT a.col,b.col
FROM    (SELECT col,ROW_NUMBER () OVER (ORDER BY (SELECT 1)) 'Row_Rank'
         FROM Table1
         )a
LEFT JOIN    (SELECT col,ROW_NUMBER () OVER (ORDER BY (SELECT 1)) 'Row_Rank'
         FROM Table1
        )b
ON a.Row_Rank = b.Row_Rank - 1

理想的には、順序付けを確実にするためにこれをセグメント化できるものがあればよいのですが、上記は機能します。ROW_NUMBER は各行の番号を作成するだけで、これを使用して 1 行のオフセットで自己結合できます。

編集: LEFT または INNER を使用できる最後のレコードに何を返したいかに応じて、LEFT JOIN に変更されました。最後の値とペアになる特定の値を返したい場合は、選択した列を ISNULL でラップできます。には次の行がありません。

于 2013-06-14T13:22:55.223 に答える