2017-09-15 57 views
0

我有一个表像这样:选择N个去年值

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,而不是以前的组。

我想与一个选择,可以容纳这些结果来结束:

设备= A,基团=最新:

id device group 
10 a  1003 
11 a  1003 

设备= A,基团=最新 - 1:

id device group 
1 a  1000 
2 a  1000 

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

编辑:

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

+0

为什么你要显示每台设备的多行? –

+0

如果它更多地讲述了想象力,实际的使用案例是位于汽车上的GPS设备之旅,我想展示整个旅程。 – Jorg

+0

听起来像[X Y问题](http://mywiki.wooledge.org/XyProblem)。实际上在这里做什么? – Bohemian

回答

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)按行列分配行号。在这种情况下,排名按照页面的降序排列。

最后,第三个块为所需页面选择所需值。如果你想要pen-ultimate页面,输入rouw_num = 2,如果第三个从上次使用row_num = 3并且同样如此。 你可以玩的值[这里]:http://sqlfiddle.com/#!15/190c06/26

+0

工作正常,欢呼声 – Jorg

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; 
+0

这也适用,它看起来比以前的答案更少。我可以认为它在大桌上更快吗? – Jorg

+0

@jorg。 。 。这应该有更好的表现。您可以测试您的数据和系统。 –