需求:之前是时间倒序显示所有栏目的文章,要求改成时间倒序显示各栏目最新的一篇文章
分析:分组的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筛选出组里最近发布的文章