下面這段內容講解的功能是oracle資料庫中有一張表,表中儲存了連續的時間記錄,同時對應的還儲存了乙個標記位。
現在要獲取乙個結果集:當標記位為0時,取前乙個為1的時間資料,如果標記位為1時,取當前記錄的時間資料。
先上乾貨。再解釋
1、建表
create table test_date(
t_time varchar(20), --時間
t_isom number default 0 --標記
)
2、初始化資料
delete from test_date;
insert into test_date(t_time,t_isom) values('20140101',1);
insert into test_date(t_time,t_isom) values('20140102',0);
insert into test_date(t_time,t_isom) values('20140103',0);
insert into test_date(t_time,t_isom) values('20140104',0);
insert into test_date(t_time,t_isom) values('20140105',0);
insert into test_date(t_time,t_isom) values('20140106',0);
insert into test_date(t_time,t_isom) values('20140107',0);
insert into test_date(t_time,t_isom) values('20140108',1);
insert into test_date(t_time,t_isom) values('20140109',1);
insert into test_date(t_time,t_isom) values('20140110',0);
insert into test_date(t_time,t_isom) values('20140111',1);
insert into test_date(t_time,t_isom) values('20140112',0);
insert into test_date(t_time,t_isom) values('20140113',0);
insert into test_date(t_time,t_isom) values('20140114',1);
3、獲取結果資料
select
case when t_isom=1 then t_time
else
nend result_time --要的結果,comment by danielinbiti
,c.*
from
(select b.*,(m-b.t_time) as m_d,(b.t_time-n) as n_d from
( select a.*,max(dnext) over(partition by x) as m,min(dpre) over(partition by x) as n from
( select t_time,t_isom,row_number() over(order by t_time)-row_number() over(partition by t_isom order by t_time) x
,lead(t_time) over(order by t_time) as dnext,lag(t_time) over(order by t_time) as dpre
from test_date
) a order by t_time
) b) c order by t_time
以上幾步可以獲取結果,當然可能對一些邊緣資料有可能存在bug,但這不影響主要原理的解釋。邊緣可以通過增加判斷處理完成。
這裡主要解釋一下第三步驟的內容
1、首先裡面一層sql
select t_time,t_isom,row_number() over(order by t_time)-row_number() over(partition by t_isom order by t_time) x
,lead(t_time) over(order by t_time) as dnext,lag(t_time) over(order by t_time) as dpre
from test_date
這裡主要有row_number() over(order by t_time)和row_number() over(partition by t_isom order by t_time)這兩個值的獲取是處理連續性的關鍵
row_number() over(order by t_time):根據時間排序獲取row_number(),保證所有記錄有連續編號
row_number() over(partition by t_isom order by t_time):根據標記位分組,再對時間排序,保證分組內記錄有連續編號。
因為兩個都是連續的,所以相減,那麼每個分組都會得到乙個值(這裡說的是每個分組,所以每個分組內的記錄也是一樣的值),暫定為x
lead和lag是統計函式,獲取下一行和前一行的記錄,這沒有難度。
2、根據第一層的結果,對結果加工,根據x值分組,獲取每個分組的最大和最小日期。
3、剩下的就可以任意擺布了,所有的結果都已經在第二層中計算出來的,可以根據自己想要任意組合獲取想要的結果。比如當前記錄最近得標記位是1的記錄等等。
Oracle大資料處理
oracle定義了乙個blob欄位用於儲存二進位制資料,但這個欄位並不能存放真正的二進位制資料,只能向這個欄位存乙個指標,然後把資料放到指標所指向的oracle的lob段中,lob段是在資料庫內部表的一部分。因而在操作oracle的blob之前,必須獲得指標 定位器 才能進行blob資料的讀取和寫入...
DMA資料處理採用連續記憶體
dma傳輸,是由pci卡直接將資料送達虛擬記憶體位址 virtual address 不用cpu中轉。主要操作包括 1 指定一片虛擬記憶體位址 2 將位址和大小告知pci 例如通過將這兩樣存在pci卡的暫存器中 3 pci卡收到資料後,讀2中設定,將pci卡中物理儲存的資料 例如硬體佇列中的資料 放...
ORACLE資料處理要點1
縮小資料處理範圍 分割槽表定時資料爬取 縮小表資料 分時段 多執行緒處理 走索引避免重複資料插入可以用唯一鍵插入異常處理 insert into tb a exception when dup val on index then null when others then return 乙個幾億的表...