一、over(partition by ......)主要和聚合函數sum()、count()、avg()等結合使用,實現分組聚合的功能
示列:根據day_id日期和mac_id機器碼進行聚合分組求每一天的該機器的銷量和即sum_num,hive sql語句:select day_id,mac_id,mac_color,day_num,sum(day_num)over(partition by day_id,mac_id order by day_id) sum_num from test_temp_mac_id;
注:day_id,mac_id,mac_color,day_num為查詢原有數據,sum_num為計算結果
day_id | mac_id | mac_color | day_num | sum_num |
20171011 | 1292 | 金色 | 1 | 89 |
20171011 | 1292 | 金色 | 14 | 89 |
20171011 | 1292 | 金色 | 2 | 89 |
20171011 | 1292 | 金色 | 11 | 89 |
20171011 | 1292 | 黑色 | 2 | 89 |
20171011 | 1292 | 粉金 | 58 | 89 |
20171011 | 1292 | 金色 | 1 | 89 |
20171011 | 2013 | 金色 | 10 | 22 |
20171011 | 2013 | 金色 | 9 | 22 |
20171011 | 2013 | 金色 | 2 | 22 |
20171011 | 2013 | 金色 | 1 | 22 |
20171012 | 1292 | 金色 | 5 | 18 |
20171012 | 1292 | 金色 | 7 | 18 |
20171012 | 1292 | 金色 | 5 | 18 |
20171012 | 1292 | 粉金 | 1 | 18 |
20171012 | 2013 | 粉金 | 1 | 7 |
20171012 | 2013 | 金色 | 6 | 7 |
20171013 | 1292 | 黑色 | 1 | 1 |
20171013 | 2013 | 粉金 | 2 | 2 |
20171011 | 12460 | 茶花金 | 1 | 1 |
二、over(partition by ......)與group by 區別
如果用group by實現一中根據day_id日期和mac_id機器碼進行聚合分組求每一天的該機器的銷量和即sum_num,
則hive sql語句為:select day_id,mac_id,sum(day_num) sum_num from test_temp_mac_id group by day_id,mac_id order by day_id;結果如下表
注:我們可以觀察到group by可以實現同樣的分組聚合功能,但sql語句不能寫與分組聚合無關的字段,否則會報錯,即group by 與over(partition by ......)主要區別為,帶上group by的hive sql語句只能顯示與分組聚合相關的字段,而帶上over(partition by ......)的hive sql語句能顯示所有字段.。
day_id | mac_id | sum_num |
20171011 | 124609 | 1 |
20171011 | 20130 | 22 |
20171011 | 12922 | 89 |
20171012 | 12922 | 18 |
20171012 | 20130 | 7 |
20171013 | 12922 | 1 |
20171013 | 20130 | 2 |
https://blog.csdn.net/qq_37325859/article/details/78222712