我最近遇到了一个Postgres SQL select测试问题,但我没有看到这个问题,也没有找到正确的答案。一个表基本上包含一本书的页码和书名,对象是创建一个SELECT,它将按如下方式排列这本书:
左页,右页
其中左页包含所有偶数页,右页包含所有奇数页编号,但其中0页显示空值,并且任何非连续页都将具有空值。可以有空白页,因此页码可以跳过。
我的猜测是使用Lag或Lead函数按顺序查找下一页,然后查看它是否连续,但遇到了问题。
下面是一个例子:
create table mysharkbook (page_no integer not null, title varchar(30) not null, unique(page_no));
insert into mysharkbook (page_no,title) VALUES (1,'Hammerhead');
insert into mysharkbook (page_no,title) VALUES (2,'Great White');
insert into mysharkbook (page_no,title) VALUES (3,'Blue');
insert into mysharkbook (page_no,title) VALUES (4,'Tiger');
insert into mysharkbook (page_no,title) VALUES (6,'Blacktip');
select * from mysharkbook;
结果
1 "Hammerhead"
2 "Great White"
3 "Blue"
4 "Tiger"
6 "Blacktip"
现在,尝试按如下方式获取“选择到”列表:
left_page, right_page
null | Hammerhead
Great White | Blue
Tiger | null
Blacktip | null
这是我(拙劣)的尝试:
SELECT CASE WHEN prev_page IS NULL OR prev_page <> page_no - 1 OR (page_no % 2) = 0 THEN NULL ELSE title END As left_title,
CASE WHEN (page_no % 2) = 1 THEN title ELSE NULL END As right_title
FROM
(
SELECT LAG (page_no, 1) OVER (
ORDER BY
page_no
) AS prev_page,
title,page_no
from mysharkbook
order by page_no
) d
有什么好办法吗?
最佳答案
另一个:
select distinct on (page.no / 2)
msb.title, lead(msb.title) over(order by page.no)
from generate_series(0, (select max(page_no) from mysharkbook)) page(no)
left join mysharkbook msb on page.no = msb.page_no
order by page.no / 2
输出:
关于sql - SQL选择书籍格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55623010/