我有一本日記,其中每一頁只包含一個主題,不超過那個
輸入
PageNum | Title
1| A
2| B
4| C
5| D
7| E
想從左到右閱讀這本書(第0頁到最后一頁),如果頁面上沒有主題,則顯示null
left | right
null | A /0,1
B | null /2,3
C | D /4,5
null | E /6,7
所以它是從左到右從 0 到最后一頁的序列有點堅持思考如何解決?請有任何建議
uj5u.com熱心網友回復:
如果您可以跳過整個雙頁,那么您需要一個行生成器來包含丟失的頁面,并且可以使用:
SELECT MAX(CASE MOD(p.pagenum, 2) WHEN 0 THEN t.title END) AS left,
MAX(CASE MOD(p.pagenum, 2) WHEN 1 THEN t.title END) AS right,
LISTAGG(p.pagenum, ',') WITHIN GROUP (ORDER BY p.pagenum) AS pages
FROM (
SELECT LEVEL - 1 AS pagenum
FROM DUAL
CONNECT BY LEVEL <= (SELECT CEIL(MAX(pagenum 1)/2)*2 FROM table_name)
) p
LEFT OUTER JOIN table_name t
ON (p.pagenum = t.PageNum)
GROUP BY
FLOOR(p.pagenum/2)
其中,對于樣本資料:
CREATE TABLE table_name (PageNum, Title) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 2, 'B' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'D' FROM DUAL UNION ALL
SELECT 7, 'E' FROM DUAL UNION ALL
SELECT 10, 'F' FROM DUAL;
輸出:
剩下 對 頁數 空值 一個 0,1 乙 空值 2,3 C D 4,5 空值 乙 6,7 空值 空值 8,9 F 空值 10,11
db<>在這里擺弄
uj5u.com熱心網友回復:
按頁碼整數除以 2 分組以獲得對。
select
max(case when mod(pagenum, 2) = 0 then title end) as title_left,
max(case when mod(pagenum, 2) = 1 then title end) as title_right
from mytable
group by trunc(pagenum / 2)
order by trunc(pagenum / 2);
是必需的MAX,因為 DBMS 不知道最多只有一行匹配模運算式。你也可以使用MIN. 沒有什么不同的。ANY_VALUE如果您已經在使用 Oracle 21c,請在此處使用。
這是 jarlh 在評論中建議的外部連接解決方??案:
with even as (select * from mytable where mod(pagenum, 2) = 0)
, odd as (select * from mytable where mod(pagenum, 2) = 1)
select
even.title as title_left,
odd.title as title_right
from even full outer join odd on odd.pagenum = even.pagenum 1
order by coalesce(even.pagenum, odd.pagenum);
演示:https ://dbfiddle.uk/?rdbms=oracle_21&fiddle=852cc5f8d45da8e832e44a9a48269c76
uj5u.com熱心網友回復:
首先創建本書的頁面骨架。僅邊界的簡單任務connect by level必須仔細設定。
select
2*(rownum-1) left, 2*rownum-1 right
from dual connect by level <= (select ceil(max(pageNum 1)/2) from table_name);
LEFT RIGHT
---------- ----------
0 1
2 3
4 5
6 7
8 9
10 11
比用兩個簡單outer joins:
with book as(
select
2*(rownum-1) left, 2*rownum-1 right
from dual connect by level <= (select ceil(max(pageNum 1)/2) from table_name)
)
select
lt.Title title_left, rt.Title title_right
from book
left outer join table_name lt on book.left = lt.pageNum
left outer join table_name rt on book.right = rt.pageNum
order by left;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/415960.html
標籤:
