Fork me on GitHub

postgre sql分组后排序取前/后几个值

这是个很常见的需求,我一般的写法是

SELECT * FROM test T
 WHERE  NOT EXIT(SELECT 1 FROM test WHERE group=T.group AND T.time >time )

  其中,group是分组字段,time是排序字段,上一句sql是按group分组,取每一组最新时间的数据

但是有一天数据出问题了,死活分不了组,于是乎寻找其他解决方案

SELECT *  FROM test from 
(SELECT test.*,row_number() over(partition by group order by time desc) rn from test) T
where rn =1 

这个row_number是干啥子的呢,简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。

row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

 

   

posted @ 2018-01-23 16:45  devass  阅读(795)  评论(0编辑  收藏  举报