91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sql server中怎么使用over()函數實現分組統計

發布時間:2021-07-26 10:59:51 來源:億速云 閱讀:599 作者:Leah 欄目:數據庫

本篇文章為大家展示了sql server中怎么使用over()函數實現分組統計,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

需求:求出以產品類別為分組,各個分組里價格最高的產品信息。

實現過程如下:

declare @t table(ProductID int,ProductName varchar(20),ProductType varchar(20),Price int)

--測試數據

insert @tselect 1,'name1','P1',3 union allselect 2,'name2','P1',5 union allselect 3,'name3','P2',4 union allselect 4,'name4','P2',4

--做法一:找到每個組里,價格最大的值;然后再找出每個組里價格等于這個值的--缺點:要進行一次join

select t1.* from @t t1 join (select ProductType,  max(Price) Price  from @t  group by ProductType) t2 on t1.ProductType = t2.ProductType where t1.Price = t2.Price order by ProductType

--做法二:利用over(),將統計信息計算出來,然后直接篩選結果集。--over() 可以讓函數(包括聚合函數)與行一起輸出。

;with cte as( select *, max(Price) over(partition by (ProductType)) MaxPrice from @t)select ProductID,ProductName,ProductType,Price from cte where Price = MaxPrice order by ProductType

--over() 的語法為:over([patition by ] <order by >)。需要注意的是,over() 前面是一個函數,如果是聚合函數,那么order by 不能一起使用。--over() 的另一常用情景是與 row_number() 一起用于分頁。

現在來介紹一下開窗函數。

窗口函數OVER()指定一組行,開窗函數計算從窗口函數輸出的結果集中各行的值。

開窗函數不需要使用GROUP BY就可以對數據進行分組,還可以同時返回基礎行的列和聚合列。

1.排名開窗函數

ROW_NUMBER、DENSE_RANK、RANK、NTILE屬于排名函數。

排名開窗函數可以單獨使用ORDER BY 語句,也可以和PARTITION BY同時使用。

PARTITION BY用于將結果集進行分組,開窗函數應用于每一組。

ODER BY 指定排名開窗函數的順序。在排名開窗函數中必須使用ORDER BY語句。

例如查詢每個雇員的定單,并按時間排序

WITH OrderInfo AS( SELECT ROW_NUMBER() OVER(PARTITION BY EmployeeID ORDER BY OrderDate) AS Number, OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK)) SELECT Number,OrderID,CustomerID, EmployeeID ,OrderDateFrom OrderInfo WHERE Number BETWEEN 0 AND 10

窗口函數根據PARTITION BY語句按雇員ID對數據行分組,然后按照ORDER BY 語句排序,排名函數ROW_NUMBER()為每一組的數據分從1開始生成一個序號。

ROW_NUMBER()為每一組的行按順序生成一個唯一的序號

RANK()也為每一組的行生成一個序號,與ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值會生成相同的序號,并且接下來的序號是不連序的。例如兩個相同的行生成序號3,那么接下來會生成序號5。

DENSE_RANK()和RANK()類似,不同的是如果有相同的序號,那么接下來的序號不會間斷。也就是說如果兩個相同的行生成序號3,那么接下來生成的序號還是4。

NTILE (integer_expression) 按照指定的數目將數據進行分組,并為每一組生成一個序號。

2.聚合開窗函數

很多聚合函數都可以用作窗口函數的運算,如SUM,AVG,MAX,MIN。

聚合開窗函數只能使用PARTITION BY子句或都不帶任何語句,ORDER BY不能與聚合開窗函數一同使用。

例如,查詢雇員的定單總數及定單信息

WITH OrderInfo AS(SELECT COUNT(OrderID) OVER(PARTITION BY EmployeeID) AS TotalCount,OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK))SELECT OrderID,CustomerID, EmployeeID ,OrderDate,TotalCountFrom OrderInfo ORDER BY EmployeeID

如果窗口函數不使用PARTITION BY 語句的話,那么就是不對數據進行分組,聚合函數計算所有的行的值。

WITH OrderInfo AS( SELECT COUNT(OrderID) OVER() AS Count,OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK))

上述內容就是sql server中怎么使用over()函數實現分組統計,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白朗县| 祁连县| 灵丘县| 金昌市| 沾化县| 穆棱市| 依安县| 略阳县| 治多县| 密山市| 观塘区| 诏安县| 涞水县| 鸡泽县| 庆云县| 克什克腾旗| 梁河县| 承德市| 青冈县| 长沙县| 渑池县| 稻城县| 白银市| 保德县| 农安县| 滦南县| 深水埗区| 都江堰市| 宁阳县| 冀州市| 额敏县| 罗江县| 东至县| 阿勒泰市| 峨眉山市| 曲靖市| 清流县| 甘德县| 镇平县| 威信县| 额尔古纳市|