工作中碰到這么個問題:
現在有表格形式如下
日期 | 名字 | 編碼 |
---|---|---|
20200910 | a | 123 |
20200815 | b | 111 |
20200625 | a | 234 |
20200208 | b | 333 |
目的是取出該表中每個名字的最新編碼。經過百度大法,有兩種方法:
1 開窗函數
with t1 as (
select *,row_number() over (partition by name order by date desc) rn
from table )
select * from t1 where rn=1
開窗后,擴展一個組內排序的字段,然后取出排序第一位的行。
2 排序后collect_list轉換成列表取指定位置元素
with t1 as(
select * from table order by name,date desc
)
select collect_list(date)[0],name,collect_list(code)[0] from t1 group by name
將日期組內排逆序后,轉換成列表(Array),取列表內的第一個元素。感覺寫法上還是沒有第一種方法來得快。
注:以上代碼未在環境中測試,僅提供思路的偽代碼