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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

plsql打开sql窗口快捷键_SQL干货|为你打开一扇窗—窗口函数

發(fā)布時(shí)間:2025/3/15 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 plsql打开sql窗口快捷键_SQL干货|为你打开一扇窗—窗口函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

很早之前就想寫一篇關(guān)于窗口函數(shù)的文章,因精力有限所以一直擱置了(一臉認(rèn)真的自我檢討),在這篇文章的準(zhǔn)備階段,我也拜讀了一些相關(guān)文章,總體來(lái)說(shuō)基本上所涉及的窗口函數(shù)相關(guān)知識(shí)均有涉及,但一萬(wàn)個(gè)讀者有一萬(wàn)個(gè)哈姆雷特,每個(gè)人的文章角度不同,本文主要是面向基礎(chǔ),希望能夠用通俗易懂的話語(yǔ)同時(shí)結(jié)合實(shí)際高頻面試題為大家打開(kāi)一扇“窗”。

正文

一、窗口函數(shù)簡(jiǎn)介

窗口函數(shù)也稱為OLAP函數(shù)。OLAP是online analytical processing的簡(jiǎn)稱,意思是對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行實(shí)時(shí)分析處理。——百度百科

窗口函數(shù)的基本語(yǔ)法如下:

<窗口函數(shù)> over (partition by <用于分組的列名> order by <用于排序的列名>)

窗口函數(shù)是針對(duì)定義的行集合執(zhí)行聚集分析,不減少原表的行數(shù)同時(shí)具備分組與排序的功能;通俗一點(diǎn)講,窗口函數(shù)會(huì)按照指定的列名分組,在組內(nèi)進(jìn)行排序,同時(shí)保持原表行數(shù)不發(fā)生變化;這與group by 分組聚合后每組返回一個(gè)值(原表行數(shù)改變)有明顯的區(qū)別。

窗口函數(shù)關(guān)鍵字:

over() : over子句中的內(nèi)容為窗口函數(shù)的作用域(范圍)

partition by :分組

order by : 排序

二、常用窗口函數(shù)介紹

1、排序函數(shù)

  • rank() 如果有并列名次的行,會(huì)占用下一名次的位置
  • dense_rank() 如果有并列名次的行,不會(huì)占用下一名次的位置
  • row_number() 不考慮并列名次的情況
select *, rank() over (order by 金額 asc) as ranking, dense_rank() over (order by 金額 asc) as dens_rank, row_number() over (order by 金額 asc) as row_num from table

排序函數(shù)區(qū)別示意表

常用場(chǎng)景:

排序函數(shù)常用于組內(nèi)排序問(wèn)題,如:topN問(wèn)題 (找出每個(gè)部門排名前N的員工)

2、偏移函數(shù)

--基本語(yǔ)法lag(exp_str,offset,defval) over()Lead(exp_str,offset,defval) over()--exp_str要取的列--offset取偏移后的第幾行數(shù)據(jù)--defval:沒(méi)有符合條件的默認(rèn)值
  • lag() lag是用于統(tǒng)計(jì)窗口內(nèi)往上(向前偏移)第n行值
  • lead() lead是用于統(tǒng)計(jì)窗口內(nèi)往下(向后偏移)第n行值
select *,lag(要偏移的列) over(partition by department order by 要排序的列) as next_lag from table --------------------------------------------------------------------------------------- select *,lead(要偏移的列) over(partition by department order by 要排序的列) as next_lead from table

偏移函數(shù)lag示意圖

偏移函數(shù)lead示意圖

常用場(chǎng)景:

多用于解決用戶連續(xù)登錄問(wèn)題,如連續(xù)7天都登陸的用戶數(shù)

拓展:

偏移函數(shù)還有first_value()、last_value(),感興趣的同學(xué)可以自行學(xué)習(xí),本文不作介紹。

3、聚合函數(shù)

  • sum()
  • avg()
  • count()
  • max()
  • min()
select * ,sum(需要計(jì)算的列名) over (order by 需要計(jì)算的列名) as sum, avg(需要計(jì)算的列名) over (order by 需要計(jì)算的列名) as avg, count(需要計(jì)算的列名) over (order by 需要計(jì)算的列名) as cot, max(需要計(jì)算的列名) over (order by 需要計(jì)算的列名) as max, min(需要計(jì)算的列名) over (order by 需要計(jì)算的列名) as min from table

聚合函數(shù)在窗口函數(shù)中是針對(duì)自身記錄、以及自身記錄之上的所有數(shù)據(jù)進(jìn)行計(jì)算。

聚合函數(shù)作為窗口函數(shù),可以直觀的看到,截止到本行數(shù)據(jù),統(tǒng)計(jì)數(shù)據(jù)是多少(最大值、最小值等);同時(shí)可以看出每一行數(shù)據(jù),對(duì)整體統(tǒng)計(jì)數(shù)據(jù)的影響。

三、代碼實(shí)操(經(jīng)典問(wèn)題)

本文代碼只展示基本框架,如遇同類問(wèn)題,直接代入使用即可

1、排序

topN問(wèn)題 (找出每個(gè)部門排名前N的員工)

select * from (select *, row_number() over (partition by 要分組的列名order by 要排序的列名 desc) as rankingfrom 表名) as a where ranking <= N

2、偏移

user_name 用戶名(連續(xù)7天都登陸的用戶數(shù))

思路:

  • 首先利用偏移窗口函數(shù)lead()求得每個(gè)用戶在每個(gè)登陸時(shí)間向后偏移7行的登陸時(shí)間;(需要注意:date 按倒序排序)
  • 再計(jì)算每個(gè)用戶在每個(gè)登陸時(shí)間滯后7天的登陸時(shí)間;
  • 如果每個(gè)用戶向后偏移7行的登陸時(shí)間等于滯后7天的時(shí)間,說(shuō)明該用戶連續(xù)登陸了7天
  • select b.user_name from (select user_name, date,lead(date,7,-1) over(partition by user_name order by date desc) as date_7 from user_login_table) b where date_sub(cast(b.date as date,7)) = cast(b.date_7 as date)

    四、總結(jié)

    本文主要介紹了窗口函數(shù)的基本概念以及幾種高頻窗口函數(shù)的用法,在實(shí)際工作中窗口函數(shù)是經(jīng)常用到的,可能乍一看不是很好理解,這是正常現(xiàn)象,多練習(xí)肯定沒(méi)問(wèn)題。

    以上,如果覺(jué)得有點(diǎn)用,請(qǐng)記得點(diǎn)贊關(guān)注,謝謝!

    總結(jié)

    以上是生活随笔為你收集整理的plsql打开sql窗口快捷键_SQL干货|为你打开一扇窗—窗口函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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