軍事院校排名函數(shù)筆記軟件很多朋友對這方面很關(guān)心,好教育整理了相關(guān)文章,供大家參考,一起來看一下吧!
數(shù)據(jù)分析課程筆記 - 20 - HIVE 核心技能之窗口函數(shù) ...
大家好呀,這節(jié)課我們學(xué)習(xí) Hive 核心技能中最難的部分——窗口函數(shù)。窗口函數(shù)我們之前在學(xué) MySQL 的時(shí)候有學(xué)過一些,但是只學(xué)了三個(gè)排序的窗口函數(shù)。這節(jié)課我們會(huì)學(xué)習(xí)更多的窗口函數(shù),包括累計(jì)計(jì)算、分區(qū)排序、切片排序以及偏移分析。
在正式學(xué)習(xí)之前,我們需要先明納頃戚確一下窗口函數(shù)和GROUP BY分組的區(qū)別。二者在功能上有相似之處,但是它們存在本質(zhì)區(qū)別。
1. 分組會(huì)改變表的結(jié)構(gòu),而窗口函數(shù)不會(huì)改變表的結(jié)構(gòu)。比如原表有10行數(shù)據(jù),分成兩組后只有兩行,而窗口函數(shù)仍然返回十行數(shù)據(jù)。 2. 分組只能查詢分組后的字段,包括分組字段(組名)和聚合函數(shù)字段。而窗口函數(shù)對查詢字段沒有限制,也就是可以查詢原表的任意字段,再加上窗口函數(shù)新增的一列值。
好啦,現(xiàn)在讓我們一起進(jìn)入窗口函數(shù)的世界吧~
本節(jié)課主要內(nèi)容:
1、洞陵累計(jì)計(jì)算窗口函數(shù) (1)sum(…) over(……) (2)avg(…) over(……) (3)語法總結(jié) 2、分區(qū)排序窗口函數(shù) (1)row_number() (2)rank() (3)dense_rank() 3、切片排序窗口函數(shù) (1)ntile(n) over(……) 4、偏移分析窗口函數(shù) 5、重點(diǎn)練習(xí)
大家在做報(bào)表的時(shí)候,經(jīng)常會(huì)遇到計(jì)算截止某月的累計(jì)數(shù)值,通常在EXCEL里可以通過函數(shù)來實(shí)現(xiàn)。
那么在HiveSQL里,該如何實(shí)現(xiàn)這種累計(jì)數(shù)值的計(jì)算呢?那就是利用窗口函數(shù)!
關(guān)于窗口函數(shù)的幾點(diǎn)說明:
需求分析 :既然要進(jìn)行按月乎行累計(jì),我們就先要把2018年的每筆交易時(shí)間轉(zhuǎn)換成月并按月分組聚合計(jì)算,得出一個(gè)2018年每月支付金額總合表,再基于這張表用窗口函數(shù)進(jìn)行累計(jì)計(jì)算。
2018年每月支付金額總和表:
再用窗口函數(shù)進(jìn)行月度累計(jì):
年度進(jìn)行匯總。
這個(gè)需求比需求1多了一個(gè)需求,那就是年度匯總。那我們只需要在上個(gè)需求的子查詢中加一個(gè) year 字段即可。
說明:
1、over 中的 partition by 起到了窗口內(nèi)將數(shù)據(jù)分組的作用。事實(shí)上,加上partition by之后,可以理解為分成了多個(gè)窗口,并在每個(gè)窗口內(nèi)進(jìn)行累加計(jì)算或者分區(qū)。
如果不加 partition by a.year 的話,運(yùn)行結(jié)果就是這樣單純按月份進(jìn)行分組的:
2、order by 按照什么順序進(jìn)行累加,升序ASC、降序DESC,默認(rèn)是升序。
大家看股票的時(shí)候,經(jīng)常會(huì)看到這種K線圖,里面經(jīng)常用到的就是7日、30日移動(dòng)平均的趨勢圖,那如何使用窗口函數(shù)來計(jì)算移動(dòng)平均值呢?
需求分析 :這個(gè)需求要求每個(gè)月近三個(gè)月的移動(dòng)平均支付金額,這里我們要用到一個(gè)新知識點(diǎn),在窗口函數(shù) avg over 的 order by a.month 之后加一句 rows between 2 preceding and current row 來設(shè)定計(jì)算移動(dòng)平均的范圍,這個(gè)語句的含義就是包含本行及前兩行。其他部分的寫法跟前面的需求類似,先取出2018年每個(gè)月的支付金額總和,再用窗口函數(shù)求移動(dòng)平均。
注意:
sum(…A…) over(partition by …B… order by …C… rows between …D1… and …D2…) avg(…A…) over(partition by …B… order by …C… rows between…D1… and …D2…)
A:需要被加工的字段名稱 B:分組的字段名稱 C:排序的字段名稱 D:計(jì)算的行數(shù)范圍
rows between unbounded preceding and current row ——包括本行和之前所有的行 rows between current row and unbounded following ——包括本行和之后所有的行 rows between 3 preceding and current row ——包括本行以內(nèi)和前三行 rows between 3 preceding and 1 following ——從前三行到下一行(5行)
max(……) over(partition by …… order by …… rows between ……and ……)
min(……) over(partition by …… order by …… rows between ……and ……)
row_number() 、rank()、dense_rank()
用法:這三個(gè)函數(shù)的作用都是返回相應(yīng)規(guī)則的排序序號
row_number() over(partition by …A… order by …B… )
rank() over(partition by …A… order by …B… )
dense_rank() over(partition by …A… order by …B… )
A:分組的字段名稱
B:排序的字段名稱
注意: 這3個(gè)函數(shù)的括號內(nèi)是不加任何字段名稱的!
row_number :它會(huì)為查詢出來的每一行記錄生成一個(gè)序號,依次排序且不會(huì)重復(fù)。
rank&dense_rank :在各個(gè)分組內(nèi), rank() 是跳躍排序,有兩個(gè)第一名時(shí)接下來就是第三名, dense_rank() 是連續(xù)排序,有兩個(gè)第一名時(shí)仍然跟著第二名。
實(shí)例練習(xí):
再眼熟一下 user_trade 的表結(jié)構(gòu):
需求分析 :先限定時(shí)間范圍,然后根據(jù) user_name 進(jìn)行分組,接著選出 分組去重后的 user_name,并計(jì)算每個(gè)用戶 goods_category 的數(shù)量(記得 distinct 去重),再然后就是用窗口函數(shù)對 goods_category 的數(shù)量進(jìn)行排序,當(dāng)然選擇哪一種排序方法要看具體要求,這里我們可以三種方法都試一下看看結(jié)果:
注意 :窗口函數(shù)中的 order by 字段不能用 select 中字段的重命名,因?yàn)槎呤峭瑫r(shí)執(zhí)行的。
需求分析 : 先用窗口函數(shù)將2019年每個(gè)用戶的支付總金額算出來并進(jìn)行排序,再以此作為子查詢,從中取出排名在第10、20、30名的用戶名、支付總金額以及排名次序。企業(yè)一般會(huì)使用 dense_rank 進(jìn)行排序,所以我們這里直接用 dense_rank。
2019年每個(gè)用戶的支付總金額排名:
2019年支付金額排名在第10、20、30名的用戶:
ntile(n) over(partition by …A… order by …B… )
n:切分的片數(shù) A:分組的字段名稱 B:排序的字段名稱
需求分析 :這個(gè)需求很簡單,把需求5第一步的排序窗口函數(shù)變成切片即可。注意時(shí)間篩選條件變成2019年1月。
需求分析 : 排名前10%,也就是一共分成10組,取第1組。那么我們先切片分組:
然后再取第一組:
說明:Lag和Lead分析函數(shù)可以在同一次查詢中取出同一字段的前N行的數(shù)據(jù)(Lag)和后N行的數(shù)據(jù)(Lead)作為獨(dú)立的列。
在實(shí)際應(yīng)用當(dāng)中,若要用到取今天和昨天的某字段差值時(shí),Lag和Lead函數(shù)的應(yīng)用就顯得尤為重要。當(dāng)然,這種操作可以用表的自連接實(shí)現(xiàn),但是LAG和LEAD與left join、right join等自連接相比,效率更高,SQL語句更簡潔。
lag(exp_str,offset,defval) over(partion by ……order by ……) lead(exp_str,offset,defval) over(partion by ……order by ……)
lag() 函數(shù)示例:
lead() 函數(shù)示例:
需求分析: 先要從 user_trade 表中取出每個(gè)用戶的支付時(shí)間,把每個(gè)用戶放到一個(gè)窗口中,按照支付時(shí)間進(jìn)行排序,取出偏移列: lead(dt,1,dt) over(partition by user_name order by dt)。接著基于該子查詢,篩選出時(shí)間間隔大于100天的用戶,并計(jì)算數(shù)量。
注意 : 如果上面偏移分析函數(shù)寫成 lead(dt,1,dt) 就不用加后面的 dt is not null 了,因?yàn)橛心J(rèn)值的話,間隔就是0,肯定是不滿足條件的。
需求分析 :
第一步 :這個(gè)需求要用到 user_trade 和 user_info 兩張表,前者取支付時(shí)間和金額,后者取城市和性別。先對這兩張表基于 user_name 進(jìn)行左連接,并取出相應(yīng)字段,用窗口函數(shù)進(jìn)行分組排序:
這一步的運(yùn)行結(jié)果是這樣的:
第二步 :基于上述結(jié)果取出TOP3:
需求分析:
第一步 :這個(gè)需求同樣要用到兩張表 user_refund 和 user_info。我們先把每個(gè)退款用戶的退款金額和*品牌取出來,并用窗口函數(shù)進(jìn)行切片排序,25%就是分成4片:
注意 :這里之所以要加 WHERE dt is not null 是因?yàn)?user_refund 是一個(gè)分區(qū)表,分區(qū)表要對分區(qū)字段進(jìn)行限制,否則 hive 會(huì)報(bào)錯(cuò)。
第二步 :選擇前25%,也就是第一片:
最后補(bǔ)充一個(gè)從 hive 導(dǎo)出結(jié)果數(shù)據(jù)的命令:
以上就是這節(jié)課的全部內(nèi)容了。做完整個(gè)練習(xí),真的半條命都沒了。窗口函數(shù)果然很難,不過掌握方法、多多練習(xí),學(xué)會(huì)拆解需求,一步一步來做,就能明顯降低難度。希望以后有機(jī)會(huì)能用到這么復(fù)雜的技能,哈哈~!
急求一次函數(shù)的詳細(xì)筆記,莪要初二的
一次函數(shù)的實(shí)例一次函數(shù)(linear function),也作線性函數(shù),在x,y坐標(biāo)軸中可以用一條直線表示,當(dāng)一次函數(shù)中的一個(gè)變量的值確定時(shí),可以用一元一次方程確定另一個(gè)變量的值。 函數(shù)性質(zhì): 1.y的變化值與對應(yīng)的x的變化值成正比例,比值為k. 即:y=kx+b(k,b為常數(shù),k≠0), ∵當(dāng)x增加m,k(x+m)+b=y+km,km/m=k。 2.當(dāng)x=0時(shí),b為函數(shù)在y軸上的點(diǎn),坐標(biāo)為(0,b)。 3當(dāng)b=0時(shí)(即 y=kx),一次函數(shù)圖像變?yōu)檎壤瘮?shù),正比例函數(shù)是特殊的一次函數(shù)。 4.在兩個(gè)一次函數(shù)表達(dá)式中: 當(dāng)兩一次函數(shù)表達(dá)式中的k相同,b也相同時(shí),兩一次函數(shù)圖像重合; 當(dāng)兩一次函數(shù)表達(dá)式中的k相碰態(tài)同,b不相同時(shí),兩一次函數(shù)圖像平行; 當(dāng)兩一次函數(shù)表達(dá)式中的k不相同,b不相同時(shí),兩一次函數(shù)圖像相交; 當(dāng)兩一次函數(shù)表達(dá)式中的k不相同,b相同時(shí),兩一次函數(shù)圖像交于y軸上的同一點(diǎn)(0,b)。 若兩個(gè)變量x,y間的關(guān)系式可以表示成Y=KX+b(k,b為常數(shù),k不等于0)則稱y是x的一次函數(shù) 圖像性質(zhì) 1.作法與圖形:通過如下3個(gè)步驟: (1)列表. ?。?)描點(diǎn);[一般取兩個(gè)點(diǎn),根據(jù)“兩點(diǎn)確定一條直線”的道理,也可叫“兩點(diǎn)法”。 一般的y=kx+b(k≠0)的圖象過(0,b)和(-b/k,0)兩點(diǎn)畫直線即可李慶。 正比例函數(shù)y=kx(k≠0)的圖象是過坐標(biāo)原點(diǎn)的一條直線,一般?。?,0)和(1,k)兩點(diǎn)。 ?。?)連線,可以作出一次函數(shù)的圖象——一條直線。因此,作一次函數(shù)的圖象只需知道2點(diǎn),并連成直線即可。(通常找函數(shù)圖象與x軸和y軸的交點(diǎn)分別是-k分之b與0,0與b). 2.性質(zhì):(1)在一次函數(shù)上的任意一點(diǎn)P(x,y),都滿足等式:y=kx+b(k≠0)。(2)一次函數(shù)與y軸交點(diǎn)的坐標(biāo)總是(0,b),與x軸總是交于(-b/k,0)正比例函數(shù)的圖像都是過原點(diǎn)。 3.函數(shù)不是數(shù),它是指某一變化過程中兩個(gè)變量之間的關(guān)系哪吵握。 4.k,b與函數(shù)圖像所在象限: y=kx時(shí)(即b等于0,y與x成正比例): 當(dāng)k>0時(shí),直線必通過第一、三象限,y隨x的增大而增大; 當(dāng)k<0時(shí),直線必通過第二、四象限,y隨x的增大而減小。 y=kx+b時(shí): 當(dāng) k>0,b>0, 這時(shí)此函數(shù)的圖象經(jīng)過第一、二、三象限; 當(dāng) k>0,b<0, 這時(shí)此函數(shù)的圖象經(jīng)過第一、三、四象限; 當(dāng) k<0,b>0, 這時(shí)此函數(shù)的圖象經(jīng)過第一、二、四象限; 當(dāng) k<0,b<0, 這時(shí)此函數(shù)的圖象經(jīng)過第二、三、四象限; 當(dāng)b>0時(shí),直線必通過第一、二象限; 當(dāng)b<0時(shí),直線必通過第三、四象限。 特別地,當(dāng)b=0時(shí),直線通過原點(diǎn)O(0,0)表示的是正比例函數(shù)的圖像。 這時(shí),當(dāng)k>0時(shí),直線只通過第一、三象限,不會(huì)通過第二、四象限。當(dāng)k<0時(shí),直線只通過第二、四象限,不會(huì)通過第一、三象限。 4、特殊位置關(guān)系: 當(dāng)平面直角坐標(biāo)系中兩直線平行時(shí),其函數(shù)解析式中K值(即一次項(xiàng)系數(shù))相等 當(dāng)平面直角坐標(biāo)系中兩直線垂直時(shí),其函數(shù)解析式中K值互為負(fù)倒數(shù)(即兩個(gè)K值的乘積為-1) ?。?③點(diǎn)斜式 y-y1=k(x-x1)(k為直線斜率,(x1,y1)為該直線所過的一個(gè)點(diǎn))④兩點(diǎn)式 (y-y1) / (y2-y1)=(x-x1)/(x2-x1)(已知直線上(x1,y1)與(x2,y3)兩點(diǎn)) ⑤截距式?。╝、b分別為直線在x、y軸上的截距)⑥實(shí)用型 (由實(shí)際問題來做) 解析式表達(dá)局限性 ①所需條件較多(3個(gè)點(diǎn),因?yàn)槭褂么ㄏ禂?shù)法需要列一個(gè)三元一次方程組) ?、?、③不能表達(dá)沒有斜率的直線(即垂直于x軸的直線;注意“沒有斜率的直線平行于y軸”表述不準(zhǔn),因?yàn)閤=0與y軸重合) ?、軈?shù)較多,計(jì)算過于煩瑣; ?、莶荒鼙磉_(dá)平行于坐標(biāo)軸的直線和過原點(diǎn)的直線。 傾斜角的概念 x軸到直線的角(直線與x軸正方向所成的角)稱為直線的傾斜角。設(shè)一直線的傾斜角為α,則該直線的斜率k=tanα。傾斜角的范圍為[0, π)。教學(xué)筆記:二次函數(shù)解析式的求法
(1)一般式: (a,b,c為常數(shù),卜扮a≠0) (2)頂點(diǎn)式:知拋物線的頂點(diǎn)為(h,k),則解析式為 (a,h,k為常數(shù),a≠0) (3)交點(diǎn)式:知拋物線與x軸交于點(diǎn)A( ,0)B( ,0),則解析式為y=a(x- )(x- )(a≠0) (1)已知拋物線上桐弊中三點(diǎn),可設(shè)為一般式。 (2)已知拋物線的頂點(diǎn)、對稱軸或極值,可設(shè)為頂點(diǎn)式。 (3)已知拋物線與x軸的兩個(gè)交點(diǎn),可設(shè)為交點(diǎn)式或一般式。 (1)若二次函數(shù)y=ax2的圖像經(jīng)過點(diǎn)P(2,16),則該二次函數(shù)的解析式為_________ (2)若拋物線y=ax2+bx+c的頂點(diǎn)是A(2,1),且經(jīng)過點(diǎn)B(1,0),則該拋物線的函數(shù)解析式為_____ (3)二次項(xiàng)系數(shù)為-1的拋物線的圖像如圖所示,則該拋物線的函數(shù)解析式為_________ 1. 問學(xué)生是否知道二次函數(shù)解析式的局山三種類型,然后開始依次介紹解析式,把每種的解析式和定義寫下來,然后一般式開始詳細(xì)地講。 (1)問一般式中的二次項(xiàng)系數(shù)、一次項(xiàng)系數(shù)、常數(shù)項(xiàng)分別是什么,解釋什么叫做二次項(xiàng)、一次項(xiàng)和常數(shù)項(xiàng) (2)進(jìn)入頂點(diǎn)式。畫圖,標(biāo)明頂點(diǎn),引導(dǎo)學(xué)生發(fā)現(xiàn)頂點(diǎn)中的h的值就是對稱軸x的值,k值就是極值;介紹什么是開口,以及開口的方向性為什么與a有關(guān);介紹使用配方法從一般式化為頂點(diǎn)式,進(jìn)行詳細(xì)地推導(dǎo),根據(jù)推導(dǎo)結(jié)果y=a(x+ ) + ,對比y=a(x-h) +k,使學(xué)生明白對稱軸為x=- =-h,極值為y=k= ,強(qiáng)調(diào)是重點(diǎn),一定要背。 (3)進(jìn)入交點(diǎn)式。說明兩種??嫉念}型:①已知交點(diǎn)求解析式②已知解析式求交點(diǎn)。求解析式就是用交點(diǎn)式,求交點(diǎn)則要連接之前學(xué)過的一元二次方程的求根公式。X= 3. 總結(jié)常見的三種考法,然后進(jìn)入例題環(huán)節(jié)通過做題、講解加深印象。 考慮到學(xué)生的接受能力,不應(yīng)該一口氣講三個(gè)知識點(diǎn),且介紹的內(nèi)容太多,而是應(yīng)該介紹完一個(gè)點(diǎn),就馬上做一道例題。不能把知識點(diǎn)全放在一起講,例題也全放在一起講。 準(zhǔn)備較充足,內(nèi)容較豐富,但是教學(xué)節(jié)奏沒有把握好。 ?以上就是好教育為大家?guī)淼能娛略盒E琶瘮?shù)筆記軟件,希望能幫助到大家!