oracle 高級用法, decode 排序, over(partition by x order by y) 開窗函數


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

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 不是數字,而是字符串呢?

如  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) 

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

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

1,平時做項目的時候,我們會經常遇到這種情況,假設一張表,每一天都會給表中的每一個種類添加一條數據,現在我們要求根據某個日期查詢出所有種類的對應數據,

這很簡單,如  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,更多關於開窗函數的用法請參考  這個


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM