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

 

coalesce()函數

①用途:mysql

將空值替換成其餘值sql

返回第一個非空值express

②表達式:函數

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

③實例:spa

 

 

 

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

ROW_NUMBER()3d

說明:返回結果集分區內行的序列號,每一個分區的第一行從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 。code

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

 

應用實例blog

/*以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;

相關文章
相關標籤/搜索