SQL 函數 coalesce()、row_number()的用法


 

coalesce()函數

①用途:

將空值替換成其他值

返回第一個非空值

②表達式:

COALESCE是一個函數, (expression_1, expression_2, ...,expression_n)依次參考各參數表達式,遇到非null值即停止並返回該值。如果所有的表達式都是空值,最終將返回一個空值。使用COALESCE在於大部分包含空值的表達式最終將返回空值。

③實例:

 

 

 

ROW_NUMBER()函數將針對SELECT語句返回的每一行,從1開始編號,賦予其連續的編號。在查詢時應用了一個排序標准后,只有通過編號才能夠保證其順序是一致的,當使用ROW_NUMBER函數時,也需要專門一列用於預先排序以便於進行編號。

ROW_NUMBER()

說明:返回結果集分區內行的序列號,每個分區的第一行從1開始。
語法:ROW_NUMBER () OVER  ([ <partition_by_clause> ] <order_by_clause>) 。
備注:ORDER BY 子句可確定在特定分區中為行分配唯一 ROW_NUMBER 的順序。
參數:<partition_by_clause> :將 FROM 子句生成的結果集划入應用了 ROW_NUMBER 函數的分區。
      <order_by_clause>:確定將 ROW_NUMBER 值分配給分區中的行的順序。
返回類型:bigint 。

注意:mysql 目前使用的版本不支持該函數,提示該版本不支持,不知道后續的高版本支持不,pg 支持,所以下面實例 使用的是 pg 

 

應用實例

/*以FoodPrice列排序並顯示排序后的行號*/
SELECT ROW_NUMBER() OVER(ORDER BY FoodPrice DESC) AS RowId,* FROM dbo.Food

 

/*以FoodType分組,然后以FoodPrice排序並顯示所在分組的相應行號*/
SELECT ROW_NUMBER() OVER(PARTITION BY FoodType ORDER BY FoodPrice DESC) AS RowId,* FROM dbo.Food

 

RANK()

/*以FoodType分組,然后以FoodPrice排序並顯示所在分組的相應行號,如果排序字段字相等則顯示相同的行號,
並跳過所在的真實行號*/
SELECT RANK() OVER(PARTITION BY FoodType ORDER BY FoodPrice) AS RowID,* FROM dbo.Food

 

DENSE_RANK()

/*以FoodType分組,然后以FoodPrice排序並顯示所在分組的相應行號,如果排序字段字相等則顯示相同的行號,
忽略相同行號,依次遞增*/
SELECT DENSE_RANK() OVER(PARTITION BY FoodType ORDER BY FoodPrice) AS RowID,* FROM dbo.Food

 

如圖實際使用

-- 按狀態分組,然后按單價降序展示
select  row_number() over(partition by t1.order_status order by t1.goods_price desc) as rank,t1.* from orderinfo t1

 

-- 按狀態分組,然后按單價升序展示
select  row_number() over(partition by t1.order_status order by t1.goods_price asc )as rank,t1.* from orderinfo t1

 

 

-- 按狀態分組,然后取出該分組中價錢最的數據

select * from (
select  row_number() over(partition by t1.order_status order by t1.goods_price desc ) as rank,t1.* from orderinfo t1) ta 
where ta.rank=1;

 


免責聲明!

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



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