今天客戶提了一個小需求,但願我能提供一條sql語句,幫助他對數據中 _field 這個字段的值去重,而且保留其餘字段的數據。第一反應是select distinct,但這種語句在對某個字段去重時,沒法保留其餘字段,因此select distinct不成立。由於用戶對去重沒有要求,字段值重複時保留任意一行就行,因此我想到當字段值重複時,選出對應主鍵最大的那條數據做爲保留數據,這樣能夠實現用戶的去重需求。可是用戶的表中又沒有主鍵,沒辦法,咱們只好先使用窗口函數建立主鍵了。mysql
由於平時喜歡用hive on spark寫sql,因此sql語句使用中間表的形式來寫,_field爲去重字段,other_fields爲原表table中_field外的其餘字段sql
1.建立主鍵(存在主鍵則無需建立,窗口函數須要遍歷全部行數據,數據量大時會很慢)數據庫
TEMP table1 = select row_number() over (order by _field) as id, _field, other_fields from table函數
2.選出每一個_field對應的最大主鍵spa
TEMP table2 = select max(id) as max_id from table1 group by _fieldspark
3.找出選中的主鍵對應的原表數據table
TEMP table3 = select _field, other_fields from table2 left join table on table2.max_id = table1.idselect
OUTPUT table3sql語句
中間表寫法看起來可能有些亂,對於mysql這種支持嵌套查詢的數據庫來講,寫起來更好理解遍歷
id爲主鍵,_field爲去重字段,other_fields爲原表table中_field外的其餘字段
select * from table where id in (select max(id) from table group by _field);