2012-02-28 7 views
2

私は絶えず問い合わせが必要な巨大なpostgresデータベースを持っています。私が求めているデータセットには、多くの繰り返し値があります。例:データベースクエリで繰り返される連続値を無視する方法

3,4,5,1,1,1,1,1,1,1 ... 1,1,1,1,1,8 

繰り返し値のシーケンスの場合、そのシーケンスの最初と最後のレコードだけを返すことは可能ですか?例:

 

If the data is: 
3,4,5,1,1,1,1,1,1,1 ... 1,1,1,1,1,8 
The query result should be: 
3,4,5,1*,1**,8 

* first occurrence of "1" 
** last occurrence of "1" 
 

編集:私は[値、のcreated_at]で構成されている選択だ
行のcreated_atによって命じました。
この情報をチャートに表示する必要があるため、最初と最後のオカレンスを取得することが重要です。その間の値は無視できます。

+0

シーケンスは行または列として返されますか? – ChristopheD

+0

異なる値を取得するだけの理由はありますか? –

+0

@ChristopheDの行。各行は[値、created_at]で構成されています – marcosbeirigo

答えて

3

あなたはかなり簡単にこれを行うにはLAGおよびLEADを使用することができます。

with T(n,created_at,bef,aft) as (
    select 
    n, 
    created_at, 
    lag(n,1) over (order by created_at), 
    lead(n,1) over (order by created_at) 
    from your_table 
) 
    select 
    n, 
    created_at 
    from T 
    where bef is distinct from n 
    or aft is distinct from n; 

のcreated_atの値が一意でない場合、あなたは(これによって、ORDER BYリストに遅れが際立っ列を追加する必要があります)と鉛()式は決定論的です。

+2

です。 –

+1

Aargh。それはIS DISTINCT FROMからではなく、DISTINCT FROMでなければなりません。私はその機能を持っていないSQL Server上でそれをテストした...私はそれを修正します。 –

+0

これはいいですね、ありがとう! – marcosbeirigo

関連する問題