c++ 编写函数返回两个值最小值_结合实例来分析SQL的窗口函数
這篇主要是用舉栗子的方式來理解SQL中的窗口函數(shù),加深大家對SQL窗口函數(shù)的理解。
樣例表這個樣例表是我為了好理解,隨便設(shè)計的,不符合數(shù)據(jù)庫設(shè)計的三范式,請忽略。
(一)標準聚合函數(shù)
標準的聚合函數(shù)有avg、count、sum、max和min,接下來分別介紹這些聚合函數(shù)的窗口函數(shù)形式。
1、移動平均窗口函數(shù)
移動平均值的定義:若依次得到測定值(x1,x2,x3,...xn)時,按順序取一定個數(shù)所做的全部算數(shù)平均值。例如(x1+x2+x3)/3,(x2+x3+x4)/3,(x3+x4+x5)/3,....就是移動平均值。其中,x可以是日或者月,以上的可以成為3日移動平均,或3月移動平均,常用于股票分析中。
語法結(jié)構(gòu):
avg影響行數(shù)的范圍(限定計算移動平均的范圍):
rows以v_info舉個例子吧
SELECT *,AVG(grade) OVER(ORDER BY stu_no ROWS BETWEEN 2 preceding AND CURRENT ROW) AS '三移動平均' FROM v_info- 對于第一行來說,沒有前面兩行,所以值就為當前行的值
- 對于第二行來說,前面只有一行,所以三移動平均就為第一行和第二行的平均值
影響行數(shù)范圍的語句在標準的聚合函數(shù)中都適用。
2、計數(shù)(count)窗口函數(shù)
窗口 函數(shù) count(*) over() 對于查詢返回的每一行,它返回了表中所有行的計數(shù)。
語法結(jié)構(gòu):
count(1)查詢出成績在90分以上的人數(shù)
SELECT這個結(jié)果說明,成績大于90分的,有兩位同學(xué)。
(2)按照課程號進行分組,找出成績大于等于80分的學(xué)生人數(shù)
SELECT從結(jié)果上可以看出,課程號為“0001”的學(xué)生人數(shù)有2名;課程號為“0002”的學(xué)生人數(shù)有2名;課程號為“0003”的學(xué)生有3名。
3、累計求和(sum)窗口函數(shù)
語法結(jié)構(gòu):
sum(1)根據(jù)學(xué)號排序,對學(xué)生的成績進行累積求和
SELECT(2)按照課程號分組,然后根據(jù)學(xué)號對成績進行累積求和
SELECTtips:一定要選擇根據(jù)學(xué)號排序,要不然得出來的是最終的累積求和結(jié)果,如下圖:
SELECT4、最大(max)、最小值(min)窗口函數(shù)
語法結(jié)構(gòu):
max(字段名1) over(partition by 字段名2 order by 字段名3 asc/desc) min(字段名1) over(partition by 字段名2 order by 字段名3 asc/desc)(1)求成績的累積最大值和累積最小值
SELECT按照學(xué)號進行排序,在累積最大值中,會依次往下找最大值,如果有比當前值大的,就更新,若沒有就保持當前;最小值同理。
(2)按照課程號進行分組,再求最大、最小值
SELECT *,MAX(grade) OVER(PARTITION BY c_no ORDER BY stu_no) AS '累積最大值',MIN(grade) OVER(PARTITION BY c_no ORDER BY stu_no) AS '累積最小值' FROM v_info(3)根據(jù)學(xué)生號和課程號求成績的累積最小值
SELECT從上圖可以看出,對于stu_no,c_no分組,后面沒有一樣的分組,所以每個stu_no,c_no都是一組,所以累積最小值就是當前的成績值。
(4)統(tǒng)計2019年10月1日-10月10日每天做新題的人的數(shù)量,重點在每天。
- 這個題的重點是在每天,所以需要求出count(時間)=10的用戶ID;
- 這個題可以使用min() over()窗口函數(shù),先根據(jù)每個做題者和試卷號,找出每個做題者的最小日期,這里和前面(3)的解題思路是一樣的;
- 如果每天都做題,那么得到的日期是不一樣的,所以count(時間)會等于10;
- 再對這部分的用戶ID進行求和,就可以找出每天都做新題的人了。
(二)排序窗口函數(shù)
我在之前就更新過了,這里就不重復(fù)寫了,感興趣的可以點鏈接,去看我之前寫的文章。
草莓女孩:SQL中常見的面試題?zhuanlan.zhihu.com(三)分組排序窗口函數(shù)
可以按照銷售額的高低、點擊次數(shù)的高低,以及成績的高低為對用戶和學(xué)生進行分組,這里的考點是:取銷售額最高的25%的用戶(將用戶分成4組,取出第一組)、取成績高的前10%的學(xué)生(將學(xué)生分成10組,取出第一組)等等。
語法結(jié)構(gòu):
ntile- ntile(n),用于將分組數(shù)據(jù)按照順序切分成n片,返回當前切片值
- ntile不支持rows between的用法
- 切片如果不均勻,默認增加第一個切片的分布
(1)取出成績前25%的學(xué)生信息
- 第一步:按照成績的高低,將學(xué)生按照成績進行切片
- 第二步:按照rank篩選出第一組,則得到最終的結(jié)果如下:
(四)偏移分析窗口函數(shù)
lag() over()和lead() over()窗口函數(shù),lag和lead分析函數(shù)可以在同一次查詢中取出同一個字段的前N行數(shù)據(jù)(lag)和后N行(lead)作為獨立的列。
在實際應(yīng)用當中,若要用到取今天和昨天的某字段的差值時,lag和lead函數(shù)的應(yīng)用就顯得尤為重要了。
適用場景:獲取用戶在某個頁面停留的起始與結(jié)束時間
語法結(jié)構(gòu):
lag(1)向前推1個日期
SELECT- 第一條記錄,往前推沒有,則為0,因為我設(shè)置了為0,默認為NULL;
- 第四條記錄是在男生組里,所以也相當于第一條記錄,所以也為0;
(2)向后推1個日期
SELECT- 在女生組里,第三條記錄往后推1個日期是沒有的,所以為無;
- 在男生組里,最后一條記錄網(wǎng)后也是沒有的,所以也為無。
(3) 統(tǒng)計每天符合以下條件的用戶數(shù):A操作之后是B操作,AB操作必須相鄰。
用戶行為表racking_log(user_id,operate_id,log_time)
解題思路:
- 先根據(jù)用戶ID和日期,用LEAD()窗口函數(shù)向后獲取下一步的步驟;
- AB必須相鄰,則表明當前的步驟為A,而下一個步驟為B,即A向下移的步驟是B;
- “每天”,即根據(jù)日期進行分組。
(4)現(xiàn)在有某個登錄表,找出連續(xù)登錄7天以上的用戶(看SQL面試題一)
草莓女孩:SQL面試題(一)?zhuanlan.zhihu.comtips:窗口函數(shù)和普通函數(shù)的區(qū)別在于:普通聚合函數(shù)結(jié)果返回的是一條,將多條記錄合成一條,而窗口函數(shù)是有幾條記錄就返回幾條。
總結(jié)
以上是生活随笔為你收集整理的c++ 编写函数返回两个值最小值_结合实例来分析SQL的窗口函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php中$stu_by,PHP基础案例二
- 下一篇: s3c2440移植MQTT