在項目中需要顯示一個廣告位的使用記錄,此時字段order_no(廣告位序號)字段可能出現多個,但是我們根據其有效期來取值(在時間段內,只有一個是有效的),因此,考慮使用ROW_NUMBER () OVER(PARTITION BY order_no ORDER BY START_Time ASC)方式,分組后取值。
1.獲取廣告歷史記錄
SELECT TOP 12 recommend_id,recommend_img_url,title,order_no, start_time FROM (SELECT ROW_NUMBER()OVER(PARTITION BY order_no ORDER BY start_time ASC) rowNum,* FROM info_latest_recommend_company_picture ilrcp WHERE ilrcp.calling_id='01' AND ilrcp.is_effect=1 and ilrcp.end_time>getdate()) temp WHERE temp.is_effect='1' AND DATEDIFF(dd,GETDATE(),end_time)>= 0 and temp.calling_id='01' ORDER BY temp.order_no ASC
此時結果記錄如下:
注意,此處,order_no=2出現了兩個,但是,在服務期限內,我們只能取有效的那個,那么該如何構造SQL,取出這條在服務期內有效的數據呢?考慮使用DISTINCT()函數消除重復行,但是,這樣的話就獲取不到有效廣告信息之外的(失效,不在服務期)的廣告信息。此時,考慮,使用ROW_NUMBER () OVER(PARTITION BY order_no ORDER BY START_Time ASC
SELECT ROW_NUMBER () OVER(PARTITION BY order_no ORDER BY START_Time ASC) rowNum,* FROM info_latest_recommend_company_picture ilrcp WHERE ilrcp.is_effect=1 and DATEDIFF(dd,GETDATE(),end_time)>= 0 AND ilrcp.calling_id='01'
這樣就好辦了,現在,我們只需要取出rowNum=1的數據就可以了
SELECT TOP 12 advert.* FROM ( SELECT ROW_NUMBER () OVER(PARTITION BY order_no ORDER BY START_Time ASC) rowNum,* FROM info_latest_recommend_company_picture ilrcp WHERE ilrcp.is_effect=1 and DATEDIFF(dd,GETDATE(),end_time)>= 0 AND ilrcp.calling_id='01' ) advert WHERE advert.rowNum=1 ORDER BY advert.order_no ASC
這樣,變獲取了我們需要的結果。
補充:ROW_NUMBER () OVER(PARTITION BY order_no ORDER BY START_Time ASC
簡單的說row_number()從1開始,為每一條分組記錄返回一個數字,這里的ROW_NUMBER() OVER (ORDER BY START_Time DESC) 是先把START_Time 列降序,再為降序以后的沒條START_Time 記錄返回一個序號。