partition by的用法

来源:互联网 发布:mac照片找不到 编辑:程序博客网 时间:2024/05/29 21:36

需求:之前是时间倒序显示所有栏目的文章,要求改成时间倒序显示各栏目最新的一篇文章


分析:分组的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 WHERET.STATUS = 9 AND T.IS_ACTIVE=1 ANDCONTENT_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 T1WHERE T1.rn = 1ORDER BY T1.PUBLISH_DATE DESC


WHERE T1.rn = 1使用行号等于1筛选出组里最近发布的文章


1 0
原创粉丝点击