Oracle数据库分组查询

    有一个数据库表 summary :

名称类型
IDVARCHAR2(64)
SUMMARYNVARCHAR2(200)
CREATE_DATETIMESTAMP(6)
DEL_FLAGCHAR(1)
USER_IDVARCHAR2(64)

     有这样几条数据:

IDSUMMARYCREATE_DATEDEL_FLAGUSER_ID
1test101-4月 -18 09.49.11.080000000 上午01001
2test206-4月 -18 09.40.28.798000000 上午01002
3test306-4月 -18 09.40.28.798000000 上午01001
4test401-4月 -18 09.49.11.080000000 上午01003

    要求:返回每个用户最新的 summary_info 信息(同一个 user_id 视为同一用户 ),比如本次查询应该返回 id = 2,id = 3,id= 4 的记录。

select 
	c.user_id,c.id,c.summary 
from 
(select 
    a.id,a.user_id,a.summary,
	ROW_NUMBER() over (partition by user_id order by create_date desc) rn 
from 
	summary_info a
where del_flag = '0'
) c where c.rn = '1' group by user_id,id,summary

    首先看括号里的 ROW_NUMBER() OVER() 语句,意思是先按照 user_id 分组,然后 create_date 降序排列,最后返回排好序的结果集。(因为数据有过更改,实际结果和上面的表格数据稍有不同。)

    然后就是对这个表 group by 查询并将 rn = 1 的记录返回。

    上面的记录中 id = 2 是最新的,所以应该返回的是前两行记录:

转载于:https://my.oschina.net/patch/blog/1794208

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值