oracle 高級用法, DECODE 排序, OVER(PARTITION BY X ORDER BY Y DESC) 開窗函數

場景 01 (IN 語句 排序 decode() 函數):html

1,咱們在查詢中會常常使用這樣的用法, select * from table_name t where t.id in (1, 3, 7, 9),這是一條查詢表中 id 爲 1, 3, 7, 9 的數據如今咱們加上一個需求,數據庫

要求查出來的數據的順序和 括號內 id 的 順序一致,有人會說直接 order by t.id 啊,多簡單,那假設順序是亂的呢?又假如 id 不是數字,而是字符串呢? oracle

如  select * from table_name t where t.id in (1, 13, 7, 9)  或者 select * from table_name t where t.id in (‘hjkhjk’, 'sfhjsf', 'sdasda', 'dasdad') 函數

2,這時候排序就會很麻煩,oracle 數據庫爲咱們提供了一個強大的函數 decode,具體用法以下:性能

select * from table_name t where t.id in (1, 3, 7, 9) order by decode (t.id, 1, 1, 3, 2, 7, 3, 9, 4) spa

其中 decode 函數的結果做爲 order by 的內容,括號內的參數爲 (排序字段,值,順序,值,順序……),其中,順序值越小,排序越靠前code

場景 02 (分組排序查詢,開窗函數 OVER (PARTITION BY COL1 ORDER BY COL2) ):htm

1,平時作項目的時候,咱們會常常遇到這種狀況,假設一張表,每一天都會給表中的每個種類添加一條數據,如今咱們要求根據某個日期查詢出全部種類的對應數據,blog

這很簡單,如  select * from table_name t where t.date = '20190101'排序

2,接下來咱們增長難度,要求若是該種類當前查詢的日期不存在數據,那麼取 最近的前一個有數據的日期 下的對應數據,通俗點說就是 咱們要查 20190101 這個日期

下各類類的數據,可是 A 種類 該日期沒數據,那麼就把日期提早,好比 20181231,若是尚未,就查 20191230,直到找到有數據的日期爲止

3,這時候有人會說,咱們能夠先查出每一個種類下 小於等於查詢日期 有數據的最大日期,在查詢數據,這種方式可行,可是若是表中有幾千幾萬個種類,這回對性能形成

很大的壓力

4,這時咱們會想到 咱們要是能把數據 根據種類分組,而後按 時間倒序 取每一個分組的第一條,不就 OK 了嗎? 這是咱們就要用到 oracle 爲咱們提供的強大分析函數,也

叫開窗函數 OVER(PARTITION BY X  ORDER BY Y DESC) 該函數通常好結合 ROW_NUMBER() 這個獲取序號的函數一塊兒結合起來,做爲 select 的 查詢字段使用,

如:select row_number() over(partition by x order by y desc) rn ……   (這種方式獲取的 rn 就是排序以後的序號)

5,其中 PARTITION BY X 是根據 X 字段分組,ORDER BY Y DESC 根據 Y 排序,  ROW_NUMBER() 在分組排序完成以後,爲每一個分組中的數據逐條添加序號,每一個分

組之間互不干擾,都是從 1 開始日後排,這是後咱們直接取行號爲 1 的數據,就完美的完成了 2 提出的需求具體以下,一個簡單的例子

 6,更多關於開窗函數的用法請參考  這個

相關文章
相關標籤/搜索