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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

讲讲你不知道的窗口函数

發(fā)布時間:2023/12/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 讲讲你不知道的窗口函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

總第145篇/張俊紅

01|什么是窗口函數(shù)

我們都知道 SQL 中的聚合函數(shù),聚合函數(shù)顧名思義就是聚集合并的意思,是對某個范圍內(nèi)的數(shù)值進行聚合,聚合后的結(jié)果是一個值或是各個類別對應(yīng)的值。如下所示:

直接聚合得到的結(jié)果是所有店鋪在這段時間內(nèi)的所有銷量之和,分組聚合(group by)得到的結(jié)果是每個店鋪在這段時間內(nèi)的銷量之和。

這種聚合函數(shù)得到的數(shù)據(jù)行數(shù)是小于基礎(chǔ)數(shù)據(jù)行數(shù)的,但是我們經(jīng)常會有這樣的需求,就是既希望看基礎(chǔ)數(shù)據(jù)同時也希望查看聚合后的數(shù)據(jù),這個時候聚合函數(shù)就滿足不了我們了,窗口函數(shù)就派上用場了。窗口函數(shù)就是既可以顯示原始基礎(chǔ)數(shù)據(jù)也可以顯示聚合數(shù)據(jù)。可能你還是不太理解,沒關(guān)系,我也剛開始不太理解,我們看幾個關(guān)于窗口函數(shù)的具體的應(yīng)用就理解了。

02|聚合函數(shù)+over()

現(xiàn)在有如下的一張表 t 存儲了每個店鋪每天的銷量:

shopname??sales??date?????? A?????????1??????2018/4/1?? B?????????3??????2018/4/1?? C?????????5??????2018/4/1?? A?????????7??????2018/4/2?? B?????????9??????2018/4/2?? C?????????2??????2018/4/2?? A?????????4??????2018/4/3?? B?????????6??????2018/4/3?? C?????????8??????2018/4/3?

如果我們想看一下每個店鋪每天的銷量和一段時間內(nèi)所有店鋪銷量的平均值的話該怎么做呢?答案就是可以用窗口函數(shù)來實現(xiàn)。只需要除了基礎(chǔ)的查詢代碼以外,還需要在你要聚合的字段后面加一個 over(),語句如下所示:

selectshopname,sales,date,avg(sales)?over() fromt

最后結(jié)果如下所示:

shopname??sales??date??????avg_window_0 A?????????1??????2018/4/1??5 B?????????3??????2018/4/1??5 C?????????5??????2018/4/1??5 A?????????7??????2018/4/2??5 B?????????9??????2018/4/2??5 C?????????2??????2018/4/2??5 A?????????4??????2018/4/3??5 B?????????6??????2018/4/3??5 C?????????8??????2018/4/3??5

02|partition by子句

再想象一下,上面我們是拿每個店鋪每天的銷量和全部店鋪全部天數(shù)的平均銷量作比較,如果我們現(xiàn)在想讓每個店鋪每天的銷量與自身全部天數(shù)的平均值作比較,該怎么實現(xiàn)呢?答案就是使用 partition by ,partition by的作用和 group by 是類似的,是進行分組聚合的,需要與 over() 搭配使用。

selectshopname,sales,date,avg(sales)?over(partition?by?shopname) fromt

最后結(jié)果如下所示:

shopname??sales??date??????avg_window_0 A?????????1??????2018/4/1??4 B?????????3??????2018/4/1??6 C?????????5??????2018/4/1??5 A?????????7??????2018/4/2??4 B?????????9??????2018/4/2??6 C?????????2??????2018/4/2??5 A?????????4??????2018/4/3??4 B?????????6??????2018/4/3??6 C?????????8??????2018/4/3??5

03|order by子句

order by 就是按照某一列數(shù)值進行排序,主要與接下來的序列函數(shù)結(jié)合使用,當(dāng) order by 與聚合函數(shù)一起使用時,是順序聚合的。什么叫順序聚合呢?給大家舉一個求和的聚合與 order by 結(jié)合使用的例子,就是類似于累計和的效果,具體代碼如下:

selectshopname,sales,date,sum(sales)?over(partition?by?shopname?order?by?date) fromt

最后運行結(jié)果如下:

shopname??sales??date??????sum_window_0 A?????????1??????2018/4/1??1 A?????????7??????2018/4/2??8 A?????????4??????2018/4/3??12 B?????????3??????2018/4/1??3 B?????????9??????2018/4/2??12 B?????????6??????2018/4/3??18 C?????????5??????2018/4/1??5 C?????????2??????2018/4/2??7 C?????????8??????2018/4/3??15

當(dāng) order by 與序列函數(shù)一起使用時就是用于排序。

04|序列函數(shù)

什么是序列函數(shù),就是可以將數(shù)據(jù)整理成一個有序的序列,然后我們可以在這個序列里面挑選我們想要的序列對應(yīng)的數(shù)據(jù)。

4.1 ntile

ntile 函數(shù)主要是用于將整表數(shù)據(jù)進行切片分組,默認(rèn)是對表在不做任何操作之前進行切片分組的,比如現(xiàn)在整個表有9行數(shù)據(jù),你要切片分成3組,那么就是第 1-3 行為一組,4-6 行為一組,7-9 行為一組。我們將店鋪銷量表切分成3組,代碼如下:

selectshopname,date,sales,ntile(3)?over() fromt

最后結(jié)果如下:

shopname??sales??date??????ntile_window_0 A?????????1??????2018/4/1??1 B?????????3??????2018/4/1??1 C?????????5??????2018/4/1??1 A?????????7??????2018/4/2??2 B?????????9??????2018/4/2??2 C?????????2??????2018/4/2??2 A?????????4??????2018/4/3??3 B?????????6??????2018/4/3??3 C?????????8??????2018/4/3??3

上面是把銷量表切分成3組了,但是對我們實際應(yīng)用中沒什么實際作用啊,你想一下,你拿一個亂序分組有什么用?如果我們和 order by結(jié)合使用就有用了,比如我先按照 sales 升序排列,然后再進行切片分組,這個時候的切片就有意義了。也可以在分組內(nèi)(partition by)近行切片分組,示例如下:

selectshopname,date,sales,ntile(3)?over(partition?by?shopname?order?by?sales) fromt

最后結(jié)果如下:

shopname??sales??date??????ntile_window_0 A?????????1??????2018/4/1??1 A?????????4??????2018/4/3??2 A?????????7??????2018/4/2??3 B?????????3??????2018/4/1??1 B?????????6??????2018/4/3??2 B?????????9??????2018/4/2??3 C?????????2??????2018/4/2??1 C?????????5??????2018/4/1??2 C?????????8??????2018/4/3??3

4.2 row_number

row_number() 從 1 開始,按照順序(注意這里是順序不是排序)生成該條數(shù)據(jù)在分組內(nèi)的對應(yīng)的序列數(shù),row_number() 的值不會存在重復(fù),當(dāng)排序的值相同時,按照表中記錄的順序進行排列。

因為 row_number() 是按照順序生成對應(yīng)的序列,而不是按照排序來生成序列的,所以 row_number() 一般需要與 order by 進行結(jié)合使用。

你現(xiàn)在想看一下,在一段時間內(nèi)每個店鋪 sales 對應(yīng)最早的一次 date 是什么時候?該怎么看呢?這個時候就可用 row_number() 與 order by 相結(jié)合,代碼如下:

selectshopname,date,sales,row_number()?over(partition?by?shopname?order?by?date) fromt

因為我們是要查看每個店鋪最早的一次 date,所以需要對 date 進行升序排列。最后結(jié)果如下:

shopname??sales??date??????row_number_window_0 A?????????1??????2018/4/1??1 A?????????7??????2018/4/2??2 A?????????4??????2018/4/3??3 B?????????3??????2018/4/1??1 B?????????9??????2018/4/2??2 B?????????6??????2018/4/3??3 C?????????5??????2018/4/1??1 C?????????2??????2018/4/2??2 C?????????8??????2018/4/3??3

我們只需要把 num = 1 的部分取出來就是我們想要的結(jié)果。

4.3 lag和lead

lag 的英文意思是滯后,而 lead 的英文意思是超前。對應(yīng)的 lag 是讓數(shù)據(jù)向后移動,而 lead 是讓數(shù)據(jù)向前移動。你可能不太理解,無所謂,直接來看實例。

現(xiàn)在你想看一下每個店鋪這一次和上一次 date 的時間差,你該怎么看呢?可以借助 lag,代碼如下:

selectshopname,date,sales,lag(date,1)?over(partition?by?shopname?order?by?date) fromt

最后結(jié)果如下:

shopname??sales??date??????lag_window_0 A?????????1??????2018/4/1??NULL A?????????7??????2018/4/2??2018/4/1 A?????????4??????2018/4/3??2018/4/2 B?????????3??????2018/4/1??NULL B?????????9??????2018/4/2??2018/4/1 B?????????6??????2018/4/3??2018/4/2 C?????????5??????2018/4/1??NULL C?????????2??????2018/4/2??2018/4/1 C?????????8??????2018/4/3??2018/4/2

現(xiàn)在你想看一下每個店鋪這次和下一次 date 之間的時間差,你又該怎么看呢?可以借助 lead,代碼如下:

selectshopname,date,sales,lead(date,1)?over(partition?by?shopname?order?by?date) fromt

最后結(jié)果如下:

shopname??sales??date??????lead_window_0 A?????????1??????2018/4/1??2018/4/2 A?????????7??????2018/4/2??2018/4/3 A?????????4??????2018/4/3??NULL B?????????3??????2018/4/1??2018/4/2 B?????????9??????2018/4/2??2018/4/3 B?????????6??????2018/4/3??NULL C?????????5??????2018/4/1??2018/4/2 C?????????2??????2018/4/2??2018/4/1 C?????????8??????2018/4/3??2018/4/3

4.4 first_value和last_value

first_value 和 last_value 都是顧名思義,就是獲取第一個值和最后一個值。但是不是真正意義上的第一個或最后一個,而是截至到當(dāng)前行的第一個或最后一個。

現(xiàn)在你想看一下每個店鋪的首次 date 和最后一次 date,你會怎么看呢?就可以直接借助first_value 和 last_value,代碼如下:

selectshopname,date,sales,first_value(date)?over(partition?by?shopname?order?by?date),last_value(date)?over(partition?by?shopname?order?by?date) fromt

最后結(jié)果如下:

shopname??sales??date??????first_value_window_0???last_value_window_0 A?????????1??????2018/4/1??2018/4/1???????????????2018/4/1 A?????????7??????2018/4/2??2018/4/1???????????????2018/4/2 A?????????4??????2018/4/3??2018/4/1???????????????2018/4/3 B?????????3??????2018/4/1??2018/4/1???????????????2018/4/1 B?????????9??????2018/4/2??2018/4/1???????????????2018/4/2 B?????????6??????2018/4/3??2018/4/1???????????????2018/4/3 C?????????5??????2018/4/1??2018/4/1???????????????2018/4/1 C?????????2??????2018/4/2??2018/4/1???????????????2018/4/2 C?????????8??????2018/4/3??2018/4/1???????????????2018/4/3

上次在公眾號活動,隨機選取3名讀者送我簽名書一本,獲獎?wù)邽?#xff1a;幻滅、順勢而為、為人民服務(wù)。請這三位讀者添加我微信 YHTZJH 發(fā)我地址。

總結(jié)

以上是生活随笔為你收集整理的讲讲你不知道的窗口函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 日本美女性高潮 | 九七在线视频 | 永久免费看片 | 在线免费看黄色片 | 午夜一区二区三区四区 | www.av777| 国产免费一区二区三区在线播放 | 日韩爱爱爱 | 波多野结衣免费视频观看 | 亚洲午夜精品 | 国产精品一区二区三区在线 | 亚洲欧美变态另类丝袜第一区 | 无码精品国产一区二区三区免费 | 国产伦人伦偷精品视频 | 黄色中文字幕 | 九九热最新 | 欧美人与性动交xxⅹxx | 久久精品国产免费 | 九九视频网 | 国产精品99久久久久久久 | 国产免费不卡 | 天天爽天天爽 | 黄色理伦片 | 强侵犯の奶水授乳羞羞漫虐 | 亚洲在线日韩 | 亚洲免费在线视频 | 国产女同视频 | 福利在线免费观看 | av午夜在线观看 | 久久久国产精品无码 | 九草av| 欧美3p视频 | h部分肌肉警猛淫文 | 亚洲精品国产精品乱码视色 | 国产最爽的乱淫视频国语对白 | 国产日b视频 | aaa久久| 色眯眯av | 日韩精品在线观看视频 | 亚洲特黄视频 | 亚洲女女做受ⅹxx高潮 | 亚洲色欲色欲www在线观看 | 欧美一区二区三区四区五区 | 老司机在线精品视频 | 韩国伦理片观看 | 狠狠干老司机 | av福利在线免费观看 | 中文字幕码精品视频网站 | 日产精品久久久 | 亚洲AV永久无码国产精品国产 | 处破痛哭a√18成年片免费 | 亚洲综合不卡 | 欧美黑人性生活 | 嫩草www | 色花av | 中文av网| 日本少妇色 | 无码人妻一区二区三区在线视频 | www.黄色.| 久久黄网站 | 午夜福利电影 | 国产福利视频网站 | 水多多在线 | 久青草国产在线 | 亚洲国产欧洲 | 国产精品入口夜色视频大尺度 | 久久精品国产久精国产 | 亚色图 | 正在播放adn156松下纱荣子 | 丁香激情网| 日韩精品在线观看中文字幕 | 久久成人小视频 | 三级av免费 | 日韩av手机在线 | 欧美激情999 | 久久精品一区二 | 99国产精品久久久 | 亚洲欧洲精品一区二区三区 | 九九热精品免费视频 | 疯狂少妇| 久久久精品一区二区 | 黑人一区 | 美女福利视频在线观看 | 91亚洲精品乱码久久久久久蜜桃 | 成人三级在线视频 | 日本少妇三级 | 老司机午夜福利视频 | 小罗莉极品一线天在线 | 4438成人网| 天天爱夜夜爱 | 国产精品激情 | 九九热视频在线 | 亚洲成人tv | 国产做爰高潮呻吟视频 | 黄瓜视频色 | 国产一区二区免费在线 | 成人免费视频网站在线观看 | 免费网站91 | 欧美整片sss |