Èí¼þ¿ª·¢Åàѵ°à >> ±à³Ì¿ª·¢ >> MySQL
MySQLʵս´°¿Úº¯ÊýSQL·ÖÎö°à¼¶Ñ§Éú¿¼ÊԳɼ¨¼°Éú»îÏû·Ñ |
一ã€�背景介ç»?/h2>今天,野鸡大å¦é«˜ï¼ˆä¸‰ï¼‰ç�的月考æˆ�绩出æ�¥äº†ï¼Œè¿™é‡Œå…ˆç»™å¤§å®¶å…¬å¸ƒä¸€ä¸‹å�„ä½�å�Œå¦çš„考试æˆ�绩ã€?/p> 接ç�€ï¼Œåœ¨ç»™å¤§å®¶å…¬å¸ƒä¸€ä¸‹å�„ä½�å�Œå¦çš„生活消费情况ã€?/p> 下é�¢æˆ‘们利用上述考试æˆ�绩和生活消费记录,利用mysqlå�šä¸€ä¸ªç®€å�•的分æž�ã€?/p> å½“ç„¶ï¼Œä»Žæœ¬æ–‡æ ‡é¢˜å°±å�¯ä»¥çœ‹å‡ºæ�¥ã€‚本文就是è¦�结å�ˆè¿™ä»½æ•°æ�®ï¼Œä¸ºå¤§å®¶è®²è¿°SQL “窗å�£å‡½æ•°â€?应该怎么用? åŒ…æ‹¬ä½ ä»¥å�Žå¦ä¹ hive或者oracleæ•°æ�®åº“,或者说数æ�®åˆ†æž�é�¢è¯•,这都将是一个很é‡�è¦�的知识点ã€?/p> 二ã€�建表è¯å�¥å’Œæ�’入数æ�®åˆ›å»ºè¡¨æ ¼
create table exam_score(
sname varchar(20),
age int,
subject varchar(20),
score varchar(20)
)charset=utf8;
# ----------------------- #
create table cost_fee(
sname varchar(20),
buydate varchar(20),
buycost int
)charset=utf8;
�入数�
insert into exam_score values
('å¼ ä¸‰' , 18, 'è¯æ–‡' , 90),
('å¼ ä¸‰' , 18, 'æ•°å¦' , 80),
('å¼ ä¸‰' , 18, '英è¯' , 70),
('æ�Žå››' , 21, 'è¯æ–‡' , 88),
('æ�Žå››' , 21, 'æ•°å¦' , 78),
('æ�Žå››' , 21, '英è¯' , 71),
('王五' , 18, 'è¯æ–‡' , 95),
('王五' , 18, 'æ•°å¦' , 83),
('王五' , 18, '英è¯' , 71),
('èµµå…' , 19, 'è¯æ–‡' , 98),
('èµµå…' , 19, 'æ•°å¦' , 90),
('èµµå…' , 19, '英è¯' , 80);
# ----------------------- #
insert into cost_fee values
('å¼ ä¸‰','2019-01-01',10),
('å¼ ä¸‰','2019-03-03',23),
('å¼ ä¸‰','2019-02-05',46),
('�四','2019-02-02',15),
('�四','2019-01-07',50),
('�四','2019-03-04',29),
('王五','2019-03-08',62),
('王五','2019-02-09',68),
('王五','2019-01-11',75),
('èµµå…','2019-02-08',55),
('èµµå…','2019-03-10',12),
('èµµå…','2019-01-12',80);
三ã€�窗å�£å‡½æ•°åˆ†ç±»ä»‹ç»?/h2>在æ£å¼�讲è¿?“窗å�£å‡½æ•°â€?应用之å‰�,我这里先带ç�€å¤§å®¶æ¢³ç�†ä¸€é�?“窗å�£å‡½æ•°â€?的基础。我们å�¯ä»¥å°†çª—å�£å‡½æ•°åˆ†ä¸ºå¦‚ä¸‹å‡ ç±»ï¼?/p> è�šå�ˆå‡½æ•° + over()æ�é…�ï¼?/p> 排åº�函数 + over()æ�é…�ï¼?/p> ntile()函数 + over()æ�é…�ï¼?/p> å��移函数 + over()æ�é…�ï¼?/p> 具体æ¯�一类,有哪些函数呢?观察下é�¢çš„æ€�维导图ã€?/p> 对于over()里é�¢ï¼Œè¿™é‡Œè¿˜æœ‰ä¸¤ä¸ªå¸¸ç”¨çš„关键å—,必须è¦�讲述。如下: partition by + å—æ®µï¼šä½ å�¯ä»¥æƒ³è±¡æˆ�group by关键å—,就是用于 â€?/strong>分组â€?的关键å—ï¼?/p>
order by + å—æ®µï¼šè¿™ä¸ªæ›´å®¹æ˜“ç�†è§£ï¼Œå°±æ˜¯ç”¨äº?“排åº�â€?的关键å—ï¼?/p>
上�给大家介�了若干常用�“窗�函数�,这里利用文首创建的数�,讲讲 “窗�函数�的应用�/p>
希望大家通过�个案例,�总结一下�个函数的�义,这里就�详细写了�/p>
â‘?计算æ¯�ä½�å�Œå¦çš„得分与平å�‡å€¼çš„æƒ…况 结果如下ï¼?/p>
â‘?计算æ¯�ä½�å�Œå¦1-3月消费情况和消费总é¢� 结果如下ï¼?/p>
â‘?计算æ¯�ä½�å�Œå¦1-3月消费情况和累计消费总é¢� 结果如下ï¼?/p>
注æ„�ï¼?结å�ˆâ‘¡â‘¢ï¼Œå¤§å®¶å�¯ä»¥å�‘现partition by结å�ˆorder by,与ä¸�结å�ˆorder by,得到的完全是ä¸�å�Œçš„结果。一个是分组求总和(ä¸�åŠ order byï¼‰ï¼›ä¸€ä¸ªæ˜¯åˆ†ç»„æ±‚ç´¯è®¡å’Œï¼ˆåŠ order by)ã€?/p>
â‘?计算æ¯�个科目的排å��,相å�Œçš„分数排å��ä¸�å�Œï¼Œé¡ºåº�ä¾�æ¬¡å¢žåŠ ç»“æžœå¦‚ä¸‹ï¼?/p>
â‘?计算æ¯�个科目的排å��,相å�Œçš„分数排å��相å�Œï¼Œä½™ä¸‹æŽ’å��è·³è·ƒå¢žåŠ ç»“æžœå¦‚ä¸‹ï¼?/p>
â‘?计算æ¯�个科目的排å��,相å�Œçš„分数排å��相å�Œï¼Œä½™ä¸‹æŽ’å��顺åº�å¢žåŠ ç»“æžœå¦‚ä¸‹ï¼?/p>
ntile()å‡½æ•°æœ‰ç‚¹ä¹±å…¥çš„æ„Ÿè§‰ï¼Œä½ ä¸�知é�“给它分哪一类。该函数主è¦�ç”?â€?/strong>æ•°æ�®åˆ‡åˆ†â€�。如果说这个函数还有点用的è¯�,就是他也å�¯ä»¥å¯¹æ•°æ�®è¿›è¡ŒæŽ’åº�,类似于上é�¢æ��到的row_number()函数ã€?/p>
â‘?对exam_scoreè¡¨ï¼Œè¿›è¡Œæ•´å¼ è¡¨åˆ‡åˆ?/p>
结果如下�/p>
ä¸�ä¿¡ä½ ä¸‹åŽ»è¯•ä¸€ä¸‹ï¼Œntile()里é�¢ä¸�管写哪个数å—,好åƒ�都å�¯ä»¥ã€?/p>
�对exam_score表,按照subject分组切分 结果如下�/p>
å�³ä½¿æ˜¯åˆ†ç»„åˆ‡åˆ†ï¼Œä½ ä¹Ÿä¼šå�‘çŽ°ï¼Œè¿™æ ·æ¯«æ— æ„�ä¹‰ï¼Œå› ä¸ºscore并没有排åº�ã€?/p>
�对exam_score表,对score排��,按照subject分组切分(最有用�/p>
结果如下�/p>
注æ„�ï¼?仔细观察这ç§�用法,基本å�¯ä»¥ç‰æ•ˆrow_number()å‡½æ•°ï¼Œæ•ˆæžœæ˜¯ä¸€æ ·çš„ã€?/p>
â‘?展示å�„ä½�å�Œå¦çš„“上次è´ä¹°æ—¶é—´â€�和“下次è´ä¹°æ—¶é—´â€?/p>
注:对于第一天,显示 “first buy�;对于最�一天,显示 “last buy�/strong>�/p>
结果如下�/p>
â‘?截æ¢åˆ°å½“å‰�日期,æ¯�ä½�å�Œå¦çš„“首次è´ä¹°æ—¶é—´â€�和“最å�Žä¸€æ¬¡è´ä¹°æ—¶é—´â€?/p>
结果如下�/p>
â‘?展示æ¯�ä½�å�Œå¦çš„“首次è´ä¹°æ—¶é—´â€�和“最å�Žä¸€æ¬¡è´ä¹°æ—¶é—´â€?/p>
注æ„�ï¼?这里并没有说 “截æ¢åˆ°å½“å‰�日期â€�,请注æ„�②③之间的区别呀。需求ä¸�å�Œï¼Œç»“果就ä¸�å�Œã€?/p>
结果如下�/p>
以上就是MySQL实战窗å�£å‡½æ•°SQL分æž�ç�级å¦ç”Ÿè€ƒè¯•æˆ�绩å�Šç”Ÿæ´»æ¶ˆè´¹çš„详细内容,更多关于SQL窗å�£å‡½æ•°åˆ†æž�æˆ�绩å�Šæ¶ˆè´¹çš„èµ„æ–™è¯·å…³æ³¨è„šæœ¬ä¹‹å®¶å…¶å®ƒç›¸å…³æ–‡ç« ï¼� |