我有一张这样的表:
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和群组都是连续的。我想要的是根据群组和设备选择id
和device
。将其视为分页类型选择。获取最后一个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秒发送一次数据。想象一下今天开车去。首先你去商店,然后你回家。第一次旅行是你开车去商店。第二次旅行是你开车回来。我想在地图上显示这些旅行,但这意味着我需要确定你的最后一次旅行,然后是之前的旅行 - 无限期,直到你旅行结束。
答案 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;