2017-08-01 25 views
2

postgreSQL(最新)を使用しています。私は全然ノブです。隣り合わせのSQLペアを組み合わせる

が、私はいつも私にrows-重複なしの偶数(文字が一意キーに類似している)と無ヌルのテーブルを与えるビューを持っている、のは呼ぶことにしましょう、それはletter_view:

| letter | 
|-------------| 
|  A  | 
|  B  | 
|  C  | 
|  D  | 
|  E  | 
|  F  | 
|  G  | 
|  H  | 

私の見解をORDER BY句を使用しているので、テーブルはあらかじめソートされています。

私がしようとしているのは、2つの行を1つの行にマージすることです。 これらの2つの行のそれぞれの値を使用します。したがって、n行の場合、結果セットには隣接する行が結合されたn/2行の が必要です。

| l1 | l2 | 
|-------|------| 
| A  | B | 
| C  | D | 
| E  | F | 
| G  | H | 

私はleadを使用して試したと私は近くだと思うが、私は非常に私が必要とする形式で取得することはできません。

私の最高のクエリの試行が次のようになります。

SELECT letter AS letter_1, lead(letter, 1) OVER (PARTITION BY 2) AS letter_2 from letter_view;

が、私は得る:

letter_1 | letter_2 
----------+---------- 
     A |  B 
     B |  C <--- Don't need this 
     C |  D 
     D |  E <--- Don't need this 
     E |  F 
     F |  G <--- Don't need this 
     G |  H 
     H |   <--- Don't need this 
(8 rows) 

私はSOの他のいくつかの答えをチェックし、 PostgreSQLのドキュメントとW3C SQLを通じて見えました私は簡潔な答えを見つけることができません。

この手法は何と呼ばれ、どのようにすればよいでしょうか?

可能であれば、純粋なSQLでこれを実行しようとしています。

LIMITとOFFSETを使って複数のクエリを使用して複数の選択肢を持つ、または潜在的にカーソルを使用してデータを取得することができますが、大きな入力セットでは非常に非効率的です。もう一度、合計のnoob。

正しい方向への助けがあれば幸いです。

答えて

1

lead()を使用して次の値を取得できます。 。 。フィルタリングする方法も必要です。

select letter_1, letter_2 
from (select letter AS letter_1, 
      lead(letter, 1) OVER (PARTITION BY 2 order by ??) AS letter_2, 
      row_number() over (partition by 2 order by ??) as seqnum 
     from letter_view 
    ) lv 
where seqnum % 2 = 1; 

注:

  • あなたは元のコードを持っているとして、私は、パーティション句が含まれて私はrow_number()をお勧めします。私は "2"が何を指しているのか分からない。
  • order byについて明示する必要があります。基礎となる表またはビューの順序に依存することは賢明ではありません。
+0

'partition by 2'は2つのグループに分割しようとしていましたが、私がその値を変更しても結果は変わらないことが分かりました。 'partition by 'を正しく使用する方法がわからない – user7015381

+0

@ user7015381 。 。データを別々のグループに分割したい場合は、 '' by by by ''を使います。例えば、 '' source ''カラムがあり、各 '' source''に対してこれをしたいとします。 –