SQL配对相邻行

时间:2017-08-01 21:43:06

标签: sql postgresql

使用postgreSQL(最新)。我是个通婚士。

我有一个视图总是给我一个偶数行的表 - 没有重复(字母类似于唯一键)并且没有空值,我们称之为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)

我在SO上检查了其他几个答案,然后仔细查看 PostgreSQL文档和w3C SQL教程,但我找不到简洁的答案。

这种技术叫做什么,我该怎么做?

如果可能,我正在尝试在纯SQL中执行此操作。

我知道我可以使用LIMIT和OFFSET的多个查询来获取具有多个选择的数据,或者可能通过使用游标,但对于大型输入集来说这似乎非常低效,尽管我可能完全错误。再次,总noob。

非常感谢任何正确方向的帮助。

1 个答案:

答案 0 :(得分: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;

注意:

  • 我在原始代码中包含了分区子句。我不知道&#34; 2&#34;是指。
  • 你应该明确order by。依赖某些基础表或视图的顺序是不明智的。