使用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。
非常感谢任何正确方向的帮助。
答案 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;
注意:
order by
。依赖某些基础表或视图的顺序是不明智的。