視窗函式編號及行轉列

2021-10-10 22:17:40 字數 1784 閱讀 8309

視窗函式中dense_rank() 與rank()函式的區別:

1、dense_rank()該函式用於計算連續排名。col2相同的行資料獲得的排名相同。

2、 rank() 該函式用於計算排名。col2相同的行資料獲得排名順序下降。

dense_rank 產生的排名是連續的,比如:1,1,2,2,3,4

rank產生的排名是遞減的,比如:1,1,3,3,5,6

array一行轉多行:

select

tea_id,

realname,

group_list,

group_id

from

gdm.gdm_teacher_auth_condition lateral view explode(group_list) v as group_id

where

dt=date_sub(current_date,1)

and tea_id in (

『16337811』,『12450323』

)結果為:

多行轉一行使用collect_set()

例如:select

user_id,

collect_set(channel) as channel

from

(select

user_id,

channel

from tmp.test_table

distribute by user_id

sort by channel

) tgroup by user_id

(注:distribute by: 在有些情況下,我們需要控制某個特定行應該到哪個reducer,通常是為了進行後續的聚集操作。distribute by子句可以做這件事。distribute by類似mr中partition(自定義分割槽),進行分割槽,結合sort by使用。

對於distribute by進行測試,一定要分配多reduce進行處理,否則無法看到distribute by的效果。

案例實操:

(1)先按照部門編號分割槽,再按照員工編號降序排序。

hive (default)> set mapreduce.job.reduces=3;

hive (default)> insert overwrite local directory 『/opt/module/datas/distribute-result』 select * from emp distribute by deptno sort by empno desc;

注意:1.distribute by的分割槽規則是根據分割槽欄位的hash碼與reduce的個數進行模除後,餘數相同的分到乙個區。

2.hive要求distribute by語句要寫在sort by語句之前。

同時:使用order by會引發全域性排序

使用distribute和sort進行分組排序

hive中自定義排序,可以用case when … then 『1』 when … then 『2』 …else end 構造列來排序,

使用distribute by 。。。sort by 可以加快查詢速度。

PIVOT函式,行轉列

pivot函式的格式如下 pivot 聚合函式 聚合列值 for 行轉列前的列名 in 行轉列後的列名1 行轉列後的列名2 行轉列後的列名3 行轉列後的列名n select from shoppingcart as c pivot count totalprice for week in 1 2 3...

oracle函式wm concat行轉列

資料庫中的兩張表 教師表 teacher 教師所教科目表 teacher km 現在要查詢教師資訊列表,把教師的科目資訊以語文 數學這種形式展示,也就是說需要將多條科目資訊取到名稱放到教師的一條記錄中。teacher id jsmc csny ff8080815233e5e0015233eb700c...

sql 行轉列 思想及示例

sql 行轉列常常在具體的業務需要中出現難於處理的情況,使用開發難度增大。故再回顧下行轉列的思想與示例。以下是詳細sql指令碼 if exists in column nvarchar 500 要把資料轉成列的列名 as begin declare queryfiled nvarchar max 用...