选择第n个到最后一个值

时间:2017-09-15 00:32:51

标签: sql postgresql

我有一张这样的表:

id device  group    
-----------------
1  a       1000
2  a       1000        
3  b       1001
4  b       1001
5  b       1001
6  b       1002
8  a       1003
9  a       1003
10 a       1003
11 a       1003
12 b       1004
13 b       1004

所有ID和群组都是连续的。我想要的是根据群组和设备选择iddevice。将其视为分页类型选择。获取最后一个group是一个简单的内部选择,但如何选择第二个最后一个组或第三个最后一组 - 等等。

我尝试了这样的行号函数:

SELECT * FROM 
   ( SELECT *, ROW_NUMBER() OVER (PARTITION BY device ORDER BY group DESC) rn FROM data) tmp 
   WHERE rn = 1;

..但是更改rn会给我以前的ID,而不是之前的组。

我想最终得出一个可以容纳这些结果的选择:

device = a,group = latest:

id device  group  
10 a       1003
11 a       1003

device = a,group = latest - 1:

id device  group  
1  a       1000
2  a       1000

任何人都知道如何做到这一点?

编辑:

用例是汽车中的GPS设备,每30秒发送一次数据。想象一下今天开车去。首先你去商店,然后你回家。第一次旅行是你开车去商店。第二次旅行是你开车回来。我想在地图上显示这些旅行,但这意味着我需要确定你的最后一次旅行,然后是之前的旅行 - 无限期,直到你旅行结束。

2 个答案:

答案 0 :(得分:1)

您可以尝试这种方法:

`with x as (
select distinct page
from test_table),
y as (
select x.page
,row_number() over (order by page desc) as row_num
from x)
select test_table.* from test_table join y on y.page = test_table.page
where y.row_num =2`

我会尝试解释我在这里所做的事情。 第一个块(x)返回不同的组(在我的例子中是页面)。

第二个块(y)根据等级为行分配行号。在这种情况下,排名按页面的降序排列。

最后,第三个块,为所需页面选择所需的值。如果你想要笔终极页面,输入rouw_num = 2,如果是最后一个使用row_num = 3,则同样如此。 您可以使用值[here]:http://sqlfiddle.com/#!15/190c06/26

答案 1 :(得分:1)

使用dense_rank()

select d.*
from (select d.*, dense_rank() over (order by group_id desc) as seqnum
      from data d
      where device = 'a'
     ) d
where seqnum = 2;