我最近遇到了一个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选择书籍格式-LMLPHP

关于sql - SQL选择书籍格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55623010/

10-08 22:14
查看更多