select count(1)
,count(distinct student_no)
from(
select cj.student_no
,if(cj.kpi_year<'2018/08','2023年8月前',kpi_year) as contract_year
,row_number() over (partition by cj.student_no order by cj.kpi_year desc)as num
from hf_mobdb.contract_joint cj
)hcj
where hcj.num=1
使用row_number() over
或者直接先排序再distinct,預設留第一條記錄
有很多資料帶有時間戳,例如行為日誌,一般來說乙個id就確定了乙個使用者主體,例如我只想取這個使用者的一條記錄、明確來說是最近的一條行為記錄,用distinct就沒法做了
思路肯定是將id相同的所有記錄按照時間發生的順序倒排取最後一條,group by、order by 、limit 1
(1)當distinct應用到多個欄位的時候,distinct必須放在開頭,其應用的範圍是其後面的所有字段,而不只是緊挨著它的乙個字段,而且distinct只能放到所有欄位的前面
(2)distinct對null是不進行過濾的,即返回的結果中是包含null值的
(3)聚合函式中的distinct,如 count( ) 會過濾掉為null 的項
注意:row_number() over (partition by id order by time desc) 給每個id加一列按時間倒敘的rank值,取rank=1
select m.id,m.gender,m.age,m.rank
from (select id,gender,age,row_number() over(partition by id order by id) rank
from temp.control_201804to201806
where id!='na' and gender!='' or age!=''
) mwherem.rank=1
Hive去重複資料
hive資料去重 insert overwrite table store select t.p key,t.sort word from select p key,sort word row number over distribute by p key sort by sort word as ...
oracle去掉表重複資料
今天在做專案過程中,碰到資料庫表存在重覆記錄,顯示的時候需要去掉重複的資料。想了老半天,最終用rank over partition by 分組字段 order by 排序字段 順序 解決了此問題。一 首先介紹下rank over partition by 分組字段 order by 排序字段 順序...
SQL語句去掉重複資料
有的時候會有部分字段重複,比如id值不一樣,但email一樣,需要刪除掉重複的資料,但相同資料只留一條的情況,如下 1.先查詢出重複的資料 select email from users u1 where rowid select max rowid from users u2 where u1.e...