2017-09-15 48 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。 。 。這應該有更好的表現。您可以測試您的數據和系統。 –