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排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)