2017-09-15 12 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が返されます。

私はこれらの結果を収容できセレクションで終わるしたいと思います:

デバイスは、グループ=最新=:

id device group 
10 a  1003 
11 a  1003 

デバイス=、グループを=最新 - 1:

id device group 
1 a  1000 
2 a  1000 

これを達成する方法を知っている人はいますか?

編集:

ユースケースは、30秒ごとにデータを送信する車でデバイスを有効にGPS、です。今日はドライブに乗ることを想像してみてください。まず店に行って家に帰る。最初の旅行はあなたが店に運転しています。 2回目の旅は、あなたが帰ってきたことです。私はそれらの旅行を地図上に示したいと思いますが、それはあなたが最後の旅行を特定する必要があることを意味します。

+0

あなたは、デバイスごとに複数の行を表示しなければならないのはなぜですか? –

+0

想像以上に話すなら、実際のユースケースは車に搭載されたgpsデバイスの旅行であり、私はその旅行全体を見せたいと思います。 – Jorg

+0

[X Y problem](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)は異なるグループ(私の場合はページ)を返します。

第2ブロック(y)は、グループに行番号を順位付けします。この場合、ランキングはページの降順になります。

最後に、3番目のブロックで、目的のページの値を選択します。ペンの究極のページが必要な場合は、最後に使用したrow_num = 3から同様に3番目の場合はrouw_num = 2と入力します。 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。 。 。これは、より良いパフォーマンスが必要です。データとシステムをテストできます。 –

関連する問題