2017-08-01 29 views
2

使用postgreSQL(最新)。我是一個總noob。SQL配對相鄰行

我有一個觀點,即總是給我一個偶數rows-沒有重複的(字母類似於唯一鍵),並沒有空的表格,讓我們把它letter_view:

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

我的看法已經使用ORDER BY子句,因此該表已預先排序。

我試圖做的是每兩行合併成一行 與這兩個行的每個值。所以對於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) 

我查了那麼幾款其他的答案,並通過 看PostgreSQL文檔和W3C SQL教程,但我找不到一個簡潔的答案。

這是什麼技術,即,我會怎麼做呢?

我想如果可能這樣做純SQL。

我知道我可以使用多個查詢與LIMIT和OFFSET通過使用遊標來獲得多個選擇的數據或可能,但似乎非常低效的大的輸入設置,雖然我可能是完全錯誤的。再次,總noob。

在正確的方向任何幫助,高度讚賞。

回答

1

您可以使用lead()獲取下一個值。 。 。但你也需要一種過濾方式。我建議row_number()

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; 

注:

  • 我包括分區子句您在原來的代碼有。我不知道「2」是指什麼。
  • 您應該明確說明order by。依靠某些基礎表或視圖的順序是不明智的。
+0

2分區是我試圖讓它分成兩組,但我現在意識到,如果我改變該值,它不會改變結果。不確定如何通過 – user7015381

+0

@ user7015381正確使用分區。 。 。如果你想把數據分成不同的組,你可以使用'partition by'分區 - 比如說你有一個「源」列,並且想爲每個「source」做這個。 –