1. 程式人生 > >partition by的用法

partition by的用法

需求:之前是時間倒序顯示所有欄目的文章,要求改成時間倒序顯示各欄目最新的一篇文章

分析:分組的SQL有2個 group by 和partition by,

如果使用 group by:

select max(publish_date),column_id from NP_CMS_MAIN group by column_id  order by  max(publish_date)

只能取得釋出時間和欄目ID兩個欄位,可是我要取得文章標題

改成這樣:

select max(title),max(publish_date),column_id from NP_CMS_MAIN group by column_id  order by  max(publish_date)

但是max(title)導致了不是取得各欄目最近時間的

所以想想用partition by來實現。

 group by更強調的是一個整體,就是組,只能顯示一個組裡滿足聚合函式的一條記錄, partition by 在整體後更強調個體,能顯示組裡所有個體的記錄,

我們想得到組裡的滿足條件的記錄可以用where條件進行篩選,而不需要聚合函式。

原SQL:

SELECT T.* FROM NP_CMS_MAIN T 
WHERE
T.STATUS = 9 AND T.IS_ACTIVE=1 
AND
CONTENT_TYPE<2  
 AND (OVERDUE_DATE IS NULL or OVERDUE_DATE>='2016-12-16 11:30:00')
 AND T.IS_ANON = 1 
)
 order by t.PUBLISH_DATE desc


 

使用row_number() over(partition by T.COLUMN_ID order by   T.PUBLISH_DATE desc)開窗函式給分組裡的記錄進行排序編號

改後:
SELECT T1.MAIN_ID,T1.TITLE FROM (
SELECT T.MAIN_ID,T.TITLE,T.PUBLISH_DATE,row_number() over(partition by T.COLUMN_ID order by T.PUBLISH_DATE desc) rn FROM NP_CMS_MAIN T 
WHERE
 T.STATUS = 9 AND T.IS_ACTIVE=1 
AND
 CONTENT_TYPE<2  
 AND (OVERDUE_DATE IS NULL or OVERDUE_DATE>='2016-12-16 11:30:00')
 AND T.IS_ANON = 1
) AS T1
WHERE T1.rn = 1
ORDER BY T1.PUBLISH_DATE DESC


WHERE T1.rn = 1使用行號等於1篩選出組裡最近釋出的文章