去重邏輯在業務進行中使用廣泛,大緻可以分兩類:DISTINCT去重和FIRST_VALUE主鍵去重,兩者的差別是DISTINCT去重是對整行資料進行去重,比如tt裡面資料可能會有重複,我們要去掉重複的資料;FIRST_VALUE是根據主鍵進行去重,可以看成是一種業務層面的去重,但是真實的業務場景使用也很普遍,比如一個使用者有多次點選,業務上隻需要取第一條。本文重點介紹這兩種去重的應用。
blink sql支援标準sql的DISTINCT去重。假如我們有如下輸入資料,并希望對相同的行進行去重。

sql可以這麼寫:<code>select distinct * from tt_source;</code> 完整的blink sql如下,
輸出時,會對第一行(1,1)和第二行(1,1)資料進行去重。輸出結果如下
還有一種情況是根據primary key字段進行去重,即如果兩行資料主鍵相同,即使其他非主鍵字段不一樣,還是隻取第一行資料。這種情況,我們可以使用FIRST_VALUE udaf函數來達到去重的目的。
對于如下輸入,并希望根據主鍵a來去重資料:
sql可以這麼寫:
完整的blink sql如下,
輸出結果:
可以看到主鍵a相同的3行,隻取了第一行。
FIRST_VALUE還支援傳一個order參數,根據order來決定first是哪行,使用的方法是<code>FIRST_VALUE(b, c)</code>,但是要注意,c字段隻能是BIGINT。假如我們有如下輸入,對于相同的主鍵,我們希望取c最小的記錄(實際場景c一般是時間字段)。
可以看到當輸出(1,1,1)後,由于又來了(1,2,0),0比1要小,是以又更新了主鍵為1的記錄,輸出(1,2)