partition by的用法
阿新 • • 發佈:2019-01-08
需求:之前是時間倒序顯示所有欄目的文章,要求改成時間倒序顯示各欄目最新的一篇文章
分析:分組的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篩選出組裡最近釋出的文章