日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

c++ 编写函数返回两个值最小值_结合实例来分析SQL的窗口函数

發(fā)布時(shí)間:2024/9/27 c/c++ 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 编写函数返回两个值最小值_结合实例来分析SQL的窗口函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇主要是用舉栗子的方式來(lái)理解SQL中的窗口函數(shù),加深大家對(duì)SQL窗口函數(shù)的理解。

樣例表

這個(gè)樣例表是我為了好理解,隨便設(shè)計(jì)的,不符合數(shù)據(jù)庫(kù)設(shè)計(jì)的三范式,請(qǐng)忽略。


(一)標(biāo)準(zhǔn)聚合函數(shù)

標(biāo)準(zhǔn)的聚合函數(shù)有avg、count、sum、max和min,接下來(lái)分別介紹這些聚合函數(shù)的窗口函數(shù)形式。

1、移動(dòng)平均窗口函數(shù)

移動(dòng)平均值的定義:若依次得到測(cè)定值(x1,x2,x3,...xn)時(shí),按順序取一定個(gè)數(shù)所做的全部算數(shù)平均值。例如(x1+x2+x3)/3,(x2+x3+x4)/3,(x3+x4+x5)/3,....就是移動(dòng)平均值。其中,x可以是日或者月,以上的可以成為3日移動(dòng)平均,或3月移動(dòng)平均,常用于股票分析中。

語(yǔ)法結(jié)構(gòu):

avg

影響行數(shù)的范圍(限定計(jì)算移動(dòng)平均的范圍):

rows

以v_info舉個(gè)例子吧

SELECT *,AVG(grade) OVER(ORDER BY stu_no ROWS BETWEEN 2 preceding AND CURRENT ROW) AS '三移動(dòng)平均' FROM v_info

  • 對(duì)于第一行來(lái)說(shuō),沒(méi)有前面兩行,所以值就為當(dāng)前行的值
  • 對(duì)于第二行來(lái)說(shuō),前面只有一行,所以三移動(dòng)平均就為第一行和第二行的平均值

影響行數(shù)范圍的語(yǔ)句在標(biāo)準(zhǔn)的聚合函數(shù)中都適用。

2、計(jì)數(shù)(count)窗口函數(shù)

窗口 函數(shù) count(*) over() 對(duì)于查詢(xún)返回的每一行,它返回了表中所有行的計(jì)數(shù)。

語(yǔ)法結(jié)構(gòu):

count

(1)查詢(xún)出成績(jī)?cè)?0分以上的人數(shù)

SELECT

這個(gè)結(jié)果說(shuō)明,成績(jī)大于90分的,有兩位同學(xué)。

(2)按照課程號(hào)進(jìn)行分組,找出成績(jī)大于等于80分的學(xué)生人數(shù)

SELECT

從結(jié)果上可以看出,課程號(hào)為“0001”的學(xué)生人數(shù)有2名;課程號(hào)為“0002”的學(xué)生人數(shù)有2名;課程號(hào)為“0003”的學(xué)生有3名。

3、累計(jì)求和(sum)窗口函數(shù)

語(yǔ)法結(jié)構(gòu):

sum

(1)根據(jù)學(xué)號(hào)排序,對(duì)學(xué)生的成績(jī)進(jìn)行累積求和

SELECT

(2)按照課程號(hào)分組,然后根據(jù)學(xué)號(hào)對(duì)成績(jī)進(jìn)行累積求和

SELECT

tips:一定要選擇根據(jù)學(xué)號(hào)排序,要不然得出來(lái)的是最終的累積求和結(jié)果,如下圖:

SELECT

4、最大(max)、最小值(min)窗口函數(shù)

語(yǔ)法結(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)求成績(jī)的累積最大值和累積最小值

SELECT

按照學(xué)號(hào)進(jìn)行排序,在累積最大值中,會(huì)依次往下找最大值,如果有比當(dāng)前值大的,就更新,若沒(méi)有就保持當(dāng)前;最小值同理。

(2)按照課程號(hào)進(jìn)行分組,再求最大、最小值

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é)生號(hào)和課程號(hào)求成績(jī)的累積最小值

SELECT

從上圖可以看出,對(duì)于stu_no,c_no分組,后面沒(méi)有一樣的分組,所以每個(gè)stu_no,c_no都是一組,所以累積最小值就是當(dāng)前的成績(jī)值。

(4)統(tǒng)計(jì)2019年10月1日-10月10日每天做新題的人的數(shù)量,重點(diǎn)在每天。

  • 這個(gè)題的重點(diǎn)是在每天,所以需要求出count(時(shí)間)=10的用戶(hù)ID;
  • 這個(gè)題可以使用min() over()窗口函數(shù),先根據(jù)每個(gè)做題者和試卷號(hào),找出每個(gè)做題者的最小日期,這里和前面(3)的解題思路是一樣的;
  • 如果每天都做題,那么得到的日期是不一樣的,所以count(時(shí)間)會(huì)等于10;
  • 再對(duì)這部分的用戶(hù)ID進(jìn)行求和,就可以找出每天都做新題的人了。
SELECT

(二)排序窗口函數(shù)

我在之前就更新過(guò)了,這里就不重復(fù)寫(xiě)了,感興趣的可以點(diǎn)鏈接,去看我之前寫(xiě)的文章。

草莓女孩:SQL中常見(jiàn)的面試題?zhuanlan.zhihu.com

(三)分組排序窗口函數(shù)

可以按照銷(xiāo)售額的高低、點(diǎn)擊次數(shù)的高低,以及成績(jī)的高低為對(duì)用戶(hù)和學(xué)生進(jìn)行分組,這里的考點(diǎn)是:取銷(xiāo)售額最高的25%的用戶(hù)(將用戶(hù)分成4組,取出第一組)、取成績(jī)高的前10%的學(xué)生(將學(xué)生分成10組,取出第一組)等等。

語(yǔ)法結(jié)構(gòu):

ntile
  • ntile(n),用于將分組數(shù)據(jù)按照順序切分成n片,返回當(dāng)前切片值
  • ntile不支持rows between的用法
  • 切片如果不均勻,默認(rèn)增加第一個(gè)切片的分布

(1)取出成績(jī)前25%的學(xué)生信息

  • 第一步:按照成績(jī)的高低,將學(xué)生按照成績(jī)進(jìn)行切片
SELECT

  • 第二步:按照rank篩選出第一組,則得到最終的結(jié)果如下:
SELECT


(四)偏移分析窗口函數(shù)

lag() over()和lead() over()窗口函數(shù),lag和lead分析函數(shù)可以在同一次查詢(xún)中取出同一個(gè)字段的前N行數(shù)據(jù)(lag)和后N行(lead)作為獨(dú)立的列。

在實(shí)際應(yīng)用當(dāng)中,若要用到取今天和昨天的某字段的差值時(shí),lag和lead函數(shù)的應(yīng)用就顯得尤為重要了。

適用場(chǎng)景:獲取用戶(hù)在某個(gè)頁(yè)面停留的起始與結(jié)束時(shí)間

語(yǔ)法結(jié)構(gòu):

lag

(1)向前推1個(gè)日期

SELECT

  • 第一條記錄,往前推沒(méi)有,則為0,因?yàn)槲以O(shè)置了為0,默認(rèn)為NULL;
  • 第四條記錄是在男生組里,所以也相當(dāng)于第一條記錄,所以也為0;

(2)向后推1個(gè)日期

SELECT

  • 在女生組里,第三條記錄往后推1個(gè)日期是沒(méi)有的,所以為無(wú);
  • 在男生組里,最后一條記錄網(wǎng)后也是沒(méi)有的,所以也為無(wú)。

(3) 統(tǒng)計(jì)每天符合以下條件的用戶(hù)數(shù):A操作之后是B操作,AB操作必須相鄰。

用戶(hù)行為表racking_log(user_id,operate_id,log_time)

解題思路:

  • 先根據(jù)用戶(hù)ID和日期,用LEAD()窗口函數(shù)向后獲取下一步的步驟;
  • AB必須相鄰,則表明當(dāng)前的步驟為A,而下一個(gè)步驟為B,即A向下移的步驟是B;
  • “每天”,即根據(jù)日期進(jìn)行分組。
SELECT

(4)現(xiàn)在有某個(gè)登錄表,找出連續(xù)登錄7天以上的用戶(hù)(看SQL面試題一)

草莓女孩:SQL面試題(一)?zhuanlan.zhihu.com

tips:窗口函數(shù)和普通函數(shù)的區(qū)別在于:普通聚合函數(shù)結(jié)果返回的是一條,將多條記錄合成一條,而窗口函數(shù)是有幾條記錄就返回幾條。

總結(jié)

以上是生活随笔為你收集整理的c++ 编写函数返回两个值最小值_结合实例来分析SQL的窗口函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。