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;