我用一段程式來說明:
create table #tmp ( t_id int IDENTITY(1,1) NOT NULL, t_name nvarchar(50), t_login_date nvarchar(8)) insert into #tmp (t_name,t_login_date) values ('paladin','20091201') insert into #tmp (t_name,t_login_date) values ('paladin','20091201') insert into #tmp (t_name,t_login_date) values ('paladin','20091205') insert into #tmp (t_name,t_login_date) values ('hugo','20091001') insert into #tmp (t_name,t_login_date) values ('hugo','20091001') insert into #tmp (t_name,t_login_date) values ('hugo','20091021')
我建立了一個暫存表 #tmp , 有三個欄位 t_id , t_name, t_login_date
同時塞了6筆預設值給他。
今天我希望查詢結果能夠包含這三個欄位的資訊,但如果 t_name, t_login_date 有重複時,只要保留一筆就好。
遇到這情況時,最簡潔的方式,就是使用 group by 來完成。我們可以把 t_name, t_login_date 當成 group by 的選項,這樣挑選後的結果,就不會有 t_name 與 t_login_date 重複現象發生。但為了要能夠讓 t_id 欄位資訊也能夠保留,剛好目前也還欠 group by 一個交待,就是使用 group by 時要包含一個彙總函數 ,所以可以用 max( t_id ) 或 min( t_id ) 來使用,而查詢語法如下:
select max(t_id) t_id,t_name,t_login_date from #tmp group by t_name,t_login_date
因為彙總函數結果欄位的欄位名稱會被視為[沒有資料行的名稱],所以我又再透過 alias 別名方式重新指定他的資料行名稱為 t_id。而執行後的結果正是我所需要的方式。
沒有留言:
張貼留言