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筛选出组里最近发布的文章


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值