Oracle連續資料處理示例

2021-06-27 22:39:25 字數 2819 閱讀 9477

下面這段內容講解的功能是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 乙個幾億的表...