比如我們想查詢每個工資小於5000元的員工資訊(城市以及年齡),並且在每行中都顯示所有工資小於5000元的員工個數,執行下面的sql語句
這個語句顯然是錯誤的,因為count()是聚合函式,然後fname和fage欄位沒有包含分組裡面。
那麼,這樣寫呢?
[sql]view plain
copy
select
t.fcity,t.fage,
count
(*)
from
person t
where
t.fsalary<5000
group
byt.fcity,t.fage
查詢結果
這與我們每行中都顯示所有工資小於
5000
元的員工個數這個條件是不符合的,那麼應該怎麼寫呢?
[sql]view plain
copy
select
t.fcity,
t.fage,
(select
count
(*)
from
person f
where
f.fsalary
from
person t
where
t.fsalary
查詢結果:
這次的查詢結果和我們想要的結果一樣了,但是這樣寫多了乙個子查詢,非常麻煩。使用開窗函式可以大大簡化實現,下面看一下開窗函式要實現這個效果怎麼寫
[sql]view plain
copy
select
t.fcity, t.fage,
count
(*) over()
from
person t
where
t.fsalary
看下執行效果:
可以看到這個sql語句與我們第乙個實驗不同的是我們在count(*)後面加了乙個over關鍵字。
開窗函式的呼叫格式為:
函式名(列)over(選項)
over關鍵字表示把函式當成開窗函式而不是聚合函式,sql標準允許將所有聚合函式用做開窗函式,使用over關鍵字來區分這兩種用法。
在上面的例子中,開窗函式count(*) over()對於查詢結果的每一行都返回所有符合條件的行的條數,over關鍵字後的括號中還經常新增選項用以改變進行聚合運算的視窗範圍(後面部落格會持續更新),如果over關鍵字後的括號中選項為空,則開窗函式會對結果集中的所有行進行聚合運算。當然,不只是count(*) over,max(fage) over(),min(fage) over()都可以。
sql函式 開窗函式簡介
與聚合函式一樣,開窗函式也是對行集組進行聚合計算,但是普通聚合函式每組只能返回乙個值,而開窗函式可以每組返回多個值。實驗一比如我們想查詢每個工資小於5000元的員工資訊 城市以及年齡 並且在每行中都顯示所有工資小於5000元的員工個數,執行下面的sql語句 select t.fcity,t.fage...
rank 開窗函式 排序類開窗函式
1,row number over 排序,連續 select score,row number over from sc 按原始 的成績順序進行排序 原始 成績順序 先將分數從大到小排序,分數相同,排名不同 select score,row number over order by score fr...
oracle開窗函式
1.使用row number分頁,查詢第1 10條資料 select t.custid,t.companyname,t.address,t.city from select row number over order by custid as rownum,custid,companyname,ad...