有一个数据库表 summary :
名称 | 类型 |
ID | VARCHAR2(64) |
SUMMARY | NVARCHAR2(200) |
CREATE_DATE | TIMESTAMP(6) |
DEL_FLAG | CHAR(1) |
USER_ID | VARCHAR2(64) |
有这样几条数据:
ID | SUMMARY | CREATE_DATE | DEL_FLAG | USER_ID |
1 | test1 | 01-4月 -18 09.49.11.080000000 上午 | 0 | 1001 |
2 | test2 | 06-4月 -18 09.40.28.798000000 上午 | 0 | 1002 |
3 | test3 | 06-4月 -18 09.40.28.798000000 上午 | 0 | 1001 |
4 | test4 | 01-4月 -18 09.49.11.080000000 上午 | 0 | 1003 |
要求:返回每个用户最新的 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 awhere 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 是最新的,所以应该返回的是前两行记录: